2017-03-08 6 views
5

検索入力にautocomplete="off"を追加して検索フォームを少し変更したいと思っていました。Wordpress検索フォームテンプレート(Genesis)をカスタマイズする

私は当初、次のような単純なフィルタを探しました:

//* Customize search form input box text 
add_filter('genesis_search_text', 'sp_search_text'); 
function sp_search_text($text) { 
    return esc_attr('Search my blog...'); 
} 

しかし/genesis/lib/structure/search.phpautocomplete="%s"のような任意の変数を持っていなかったので、その属性を対象とすることができませんでした。私はおそらくそれを直接導入しなければならなかったので、私はsearch.phpを親テーマフォルダから子テーマフォルダフォルダにコピーしました。

ファイルの元のコードは次のようました:

<?php 

/** 
* Replace the default search form with a Genesis-specific form. 
* 
* The exact output depends on whether the child theme supports HTML5 or not. 
* 
* Applies the `genesis_search_text`, `genesis_search_button_text`, `genesis_search_form_label` and 
* `genesis_search_form` filters. 
* 
* @since 0.2.0 
* 
* @return string HTML markup for search form. 
*/ 

add_filter('get_search_form', 'genesis_search_form'); 

function genesis_search_form() { 
    $search_text = get_search_query() ? apply_filters('the_search_query', get_search_query()) : apply_filters('genesis_search_text', __('Search this website', 'genesis') . ' &#x02026;'); 

    $button_text = apply_filters('genesis_search_button_text', esc_attr__('Search', 'genesis')); 

    $onfocus = "if ('" . esc_js($search_text) . "' === this.value) {this.value = '';}"; 
    $onblur = "if ('' === this.value) {this.value = '" . esc_js($search_text) . "';}"; 

    // Empty label, by default. Filterable. 
    $label = apply_filters('genesis_search_form_label', ''); 

    $value_or_placeholder = (get_search_query() == '') ? 'placeholder' : 'value'; 

    if (genesis_html5()) { 

     $form = sprintf('<form %s>', genesis_attr('search-form')); 

     if (genesis_a11y('search-form')) { 

      if ('' == $label) { 
       $label = apply_filters('genesis_search_text', __('Search this website', 'genesis')); 
      } 

      $form_id = uniqid('searchform-'); 

      $form .= sprintf(
       '<meta itemprop="target" content="%s"/><label class="search-form-label screen-reader-text" for="%s">%s</label><input itemprop="query-input" type="search" name="s" id="%s" %s="%s" /><input type="submit" value="%s" /></form>', 
       home_url('/?s={s}'), 
       esc_attr($form_id), 
       esc_html($label), 
       esc_attr($form_id), 
       $value_or_placeholder, 
       esc_attr($search_text), 
       esc_attr($button_text) 
      ); 

     } else { 

      $form .= sprintf(
       '%s<meta itemprop="target" content="%s"/><input itemprop="query-input" type="search" name="s" %s="%s" /><input type="submit" value="%s" /></form>', 
       esc_html($label), 
       home_url('/?s={s}'), 
       $value_or_placeholder, 
       esc_attr($search_text), 
       esc_attr($button_text) 
      ); 
     } 


    } else { 

     $form = sprintf(
      '<form method="get" class="searchform search-form" action="%s" role="search" >%s<input type="text" value="%s" name="s" class="s search-input" onfocus="%s" onblur="%s" /><input type="submit" class="searchsubmit search-submit" value="%s" /></form>', 
      home_url('/'), 
      esc_html($label), 
      esc_attr($search_text), 
      esc_attr($onfocus), 
      esc_attr($onblur), 
      esc_attr($button_text) 
     ); 

    } 

    return apply_filters('genesis_search_form', $form, $search_text, $button_text, $label); 

} 

それから私は、元のフィルタを削除し、私のフィルタを追加しました:

remove_filter('get_search_form', 'genesis_search_form'); 

add_filter('get_search_form', 'my_search_form'); 

そして、検索入力にautocomplete="off"を追加しましたので、現在のis:

<?php 

/** 
* Replace the default search form with a Genesis-specific form. 
* 
* The exact output depends on whether the child theme supports HTML5 or not. 
* 
* Applies the `genesis_search_text`, `genesis_search_button_text`, `genesis_search_form_label` and 
* `genesis_search_form` filters. 
* 
* @since 0.2.0 
* 
* @return string HTML markup for search form. 
*/ 

remove_filter('get_search_form', 'genesis_search_form'); 

add_filter('get_search_form', 'my_search_form'); 

function my_search_form() { 
    $search_text = get_search_query() ? apply_filters('the_search_query', get_search_query()) : apply_filters('genesis_search_text', __('Search this website', 'genesis') . ' &#x02026;'); 

    $button_text = apply_filters('genesis_search_button_text', esc_attr__('Search', 'genesis')); 

    $onfocus = "if ('" . esc_js($search_text) . "' === this.value) {this.value = '';}"; 
    $onblur = "if ('' === this.value) {this.value = '" . esc_js($search_text) . "';}"; 

    // Empty label, by default. Filterable. 
    $label = apply_filters('genesis_search_form_label', ''); 

    $value_or_placeholder = (get_search_query() == '') ? 'placeholder' : 'value'; 

    if (genesis_html5()) { 

     $form = sprintf('<form %s>', genesis_attr('search-form')); 

     if (genesis_a11y('search-form')) { 

      if ('' == $label) { 
       $label = apply_filters('genesis_search_text', __('Search this website', 'genesis')); 
      } 

      $form_id = uniqid('searchform-'); 

      $form .= sprintf(
       '<meta itemprop="target" content="%s"/><label class="search-form-label screen-reader-text" for="%s">%s</label><input itemprop="query-input" type="search" name="s" id="%s" %s="%s" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" dir="auto" /><input type="submit" value="%s" /></form>', 
       home_url('/?s={s}'), 
       esc_attr($form_id), 
       esc_html($label), 
       esc_attr($form_id), 
       $value_or_placeholder, 
       esc_attr($search_text), 
       esc_attr($button_text) 
      ); 

     } else { 

      $form .= sprintf(
       '%s<meta itemprop="target" content="%s"/><input itemprop="query-input" type="search" name="s" %s="%s" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" dir="auto" /><input type="submit" value="%s" /></form>', 
       esc_html($label), 
       home_url('/?s={s}'), 
       $value_or_placeholder, 
       esc_attr($search_text), 
       esc_attr($button_text) 
      ); 
     } 


    } else { 

     $form = sprintf(
      '<form method="get" class="searchform search-form" action="%s" role="search" >%s<input type="text" value="%s" name="s" class="s search-input" onfocus="%s" onblur="%s" autocomplete="off" spellcheck="false" autocorrect="off" autocapitalize="off" dir="auto" /><input type="submit" class="searchsubmit search-submit" value="%s" /></form>', 
      home_url('/'), 
      esc_html($label), 
      esc_attr($search_text), 
      esc_attr($onfocus), 
      esc_attr($onblur), 
      esc_attr($button_text) 
     ); 

    } 

    return apply_filters('my_search_form', $form, $search_text, $button_text, $label); 

} 

現在のところ、ホームページ他のページではヘッダーとタグラインだけが生成されます。私は親のテーマファイルを直接編集することができましたが、すべてを邪魔しないようにするための代替手段が必要でした。任意の洞察または提案?私はgenesis_search_form機能が終わりgenesis_search_formフィルタを適用していることがわかり


Documentation for get_search_form

Documentation for genesis_search_form

Documentation for Genesis Snippets

+0

あなたは 'my_search_form()'関数はどこにありますか? – questlooking

+0

searchform.phpでは、元の 'genesis_search_form()'フィルタを削除し、 'genesis_search_form()'のすべてのインスタンスを 'my_search_form()'に置き換え、 'autocomplete =" off "をコードに追加します。エラーは、ページの全体または一部が白く見えるエラー500です。コードが元の場所の外で正しく動作しないようですが、親のテーマフレームワークを直接編集しないようにするための代替手段が必要でした。 – SilverLink

+0

オリジナルを削除するための共鳴とは何か...創造の代わりにフォームを呼び出す限り、新しいフォームに影響する理由はないはずです。 –

答えて

1

genesis_search_form関数全体を書き直すのではなく、その関数を使ってフォームを操作し、新しいフィルタの中でDOMDocumentを使用して、autocomplete属性を追加することができます。あなたの子供のテーマfunctions.php内部に次のコードを試してみて、それが動作するかどうかを確認:

add_filter('genesis_search_form', 'my_search_form_filter', 5); 
function my_search_form_filter($form) { 

    $document = new DOMDocument(); 
    $document->loadHTML($form); 
    $xpath = new DOMXPath($document); 
    $input = $xpath->query('//input[@name="s"]'); 
    if ($input->length > 0) { 
     $input->item(0)->setAttribute('autocomplete', 'off'); 
    } 

    # remove <!DOCTYPE 
    $document->removeChild($document->doctype); 
    # remove <html><body></body></html> 
    $document->replaceChild($document->firstChild->firstChild->firstChild, $document->firstChild); 
    $form_html = $document->saveHTML(); 

    return $form_html; 
} 

デフォルトget_search_formフィルタを無効にし、あなたを追加し、あなたのコードを無効にすることを忘れないでください。

EDIT

前のコードが間違っていた、動作するコード上で最新に更新してください。私はgenesisテーマとgenesis-childテーマでテストしました。

ここでは、インストールgenesisテーマに私のDev Wordpressサイトを見つけることができますし、検索入力ボックスを検査し、それがoffに設定autocompleteの属性があり見ることができます:http://wp.dev.lytrax.net/

をそしてここで、フォームの検索入力を示すスクリーンショットであります

Wordpress screenshot

EDIT 2

autocomplete属性を持つ要素

genesis-sampleテーマは、HTML5の検索フォームを使用していますし、それはこのように、それは多くの警告をスローし、それを継続して失敗し、createDocumentFragment要素がappendXMLを使用して扱うことができるコード内のいくつかのmetaタグが含まれています。これらのPHPの警告は表示されません。ほとんどの場合、PHPの警告が無効になっている可能性が高いからです。私の更新されたコードを試してください。ファイルをgenesis-sample/functions.phpの末尾に追加し、autocomplete属性が追加されているかどうかを確認します。

+0

ありがとうございます。あなたのアプローチは面白いです。しかし、私は 'functions.php'のコードを' head'とクラスを持たない空の 'body'だけがすべてのページに生成するので、何かが正しくないと思います。 – SilverLink

+0

@SilverLink私の更新された回答を見て、新しいコードを試してください。起源のテーマの検索機能に加えたすべてのフィルタと変更を無効にすることを忘れないでください。 –

+0

お試しいただきありがとうございます。大変申し訳ありませんが、新しくフレームワークと起源サンプルをダウンロードした後でも、私はあなたの例を再現できません。今度はすべての検索フォームが削除されますので、すぐに画像をアップロードしてみましょう。 – SilverLink

関連する問題