2017-03-12 11 views
1

私はgenesis_search_form()を呼び出すと、それは出力:検索フォーム内にスパンを挿入するにはどうすればよいですか? (創世記)

<form class="search-form"> 
    <meta itemprop="target"> 
    <input type="search"> 
    <input type="submit"> 
</form> 

しかし、私は次のように、それは内部spanで生成したい:

<form class="search-form"> 
    <meta itemprop="target"> 
    <input type="search"> 
    <span class="submit-icon"></span> 
    <input type="submit"> 
</form> 

がに安全な代替を探していました

add_filter('genesis_search_form', 'my_search_button'); 
function my_search_button($form) { 
    return str_replace( 
     '<input type="submit"', 
     '<span class="submit-icon"></span><input type="submit"', 
     $form 
    ); 
} 

タグの開始を置き換えないようにします。何か案は?

+1

この機能には機能がない限り、これを行うことはできません。機能をフォークし、必要に応じてカスタマイズすることができます。 – hassan

答えて

0

あなたがのDOMDocumentと大丈夫であれば、このバージョンは、HTML5のためのより良い作品:ここにあなたのコードの作業バージョンです。

add_filter('genesis_search_form', 'my_search_button'); 
function my_search_button($form) { 

    $document = new DOMDocument(); 
    $document->loadHTML($form); 
    $xpath = new DOMXPath($document); 
    $input = $xpath->query('//input[@type="submit"]'); 
    $span = $document->createElement('span'); 
    $span->setAttribute('class', 'sb-icon'); 

    if ($input->length > 0) { 
     $input->item(0)->parentNode->insertBefore($span, $input->item(0)); 
    } 

    $document->removeChild($document->doctype); 
    $document->replaceChild($document->firstChild->firstChild->firstChild, $document->firstChild); 
    $form_html = $document->saveHTML(); 

    return $form_html; 
} 
1

関数に変更を加えることが許可されている場合は、それを実行します。そうでない場合は、ハックしてください!

$('form.search-form input[type=search]').after('<span class="submit-icon"></span>'); 
+2

答えてくれてありがとう、 'jQuery'は本当に簡単ですが、' php'の解決策を探していました。 –

0

DOMDocumentを使用してください! https://3v4l.org/ats7D

<?php 

// Create a DOM Document 
$dom = new DomDocument(); 

// Load your HTML 
$dom->loadHTML('<form class="search-form"> 
    <meta itemprop="target"> 
    <input type="search"> 
    <input type="submit"> 
</form>'); 

// Create a new <span> 
$span = $dom->createElement('span', 'hello'); 

// Grab the <input elements (we dont have an ID) 
$inputs = $dom->getElementsByTagName('input'); 

// Add the <span> between the inputs 
$inputs->item(0)->parentNode->insertBefore($span, $inputs->item(1)); 

// By default when you loadHTML(), it generates doctype, html, head, and  body tags. remove them! 
$dom->removeChild($dom->doctype); 
$dom->replaceChild($dom->firstChild->firstChild->firstChild, $dom->firstChild); 

// Finally get the HTML 
$html = $dom->saveHTML(); 

// And output/return/whatever 
echo $html; 
+0

素晴らしいです。彼はそれがあなたが望むように、それをサーバー側に保つことができます。何らかの形で結果をキャッシュしておくと、リクエストごとにDOMチャンクを操作する必要がなくなります。 –

関連する問題