2017-03-08 80 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.php沒有任何變量一樣autocomplete="%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"到搜索輸入,所以目前是:

<?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); 

} 

它目前在主頁上工作完美,bu t在任何其他頁面中只生成標題和標語。我可以直接編輯父主題文件,但希望有一種方法可以避免搞砸一切。任何見解或建議?


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()'過濾器,並用'my_search_form()'替換了'genesis_search_form()'的所有實例,並將'autocomplete =「off」'添加到代碼中。錯誤是錯誤500,其中整個或部分頁面顯示爲白色,似乎代碼無法在其原始位置外正常運行,但我希望有一種替代方法可以避免直接編輯父主題框架。 – SilverLink

+0

什麼是刪除原來的共鳴......只要你打電話給你的形式,而不是起源,應該沒有理由會影響你的新形式。 –

回答

1

我看到genesis_search_form功能末適用genesis_search_form過濾器。您可以使用它來處理表單並在新過濾器中使用DOMDocument來添加所需的autocomplete屬性,而不是重寫整個genesis_search_form函數。試試你的子主題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過濾器,並增加了你的。

編輯

上面的代碼錯了,請用上面的代碼工作的最新更新。我已經用genesisgenesis-child主題對它進行了測試。

在這裏,你可以找到我的Dev Wordpress網站安裝了genesis主題,您可以檢查搜索輸入框,看看它有autocomplete屬性設置爲offhttp://wp.dev.lytrax.net/

,這裏是一個截圖顯示的形式搜索輸入具有autocomplete屬性元素:

Wordpress screenshot

編輯2

genesis-sample主題使用HTML5搜索表單,它包含createDocumentFragment元素可使用appendXML處理的代碼中的一些meta標記,因此會引發許多警告並且無法繼續。您看不到這些PHP警告,因爲很可能您已禁用它們。請嘗試更新我的代碼。將其添加到genesis-sample/functions.php文件的末尾,並檢查它是否添加autocomplete屬性。

+0

謝謝你的迴應。你的方法很有趣。但是我認爲有些東西是不對的,因爲當我在'functions.php'中代碼時,只有頭部和沒有類的空'body'會在所有頁面中生成。 – SilverLink

+0

@SilverLink請查看我更新的答案並嘗試新的代碼。不要忘記禁用所有過濾器和您對創世主題的搜索功能所做的更改。 –

+0

謝謝你的嘗試。我非常抱歉,但即使下載了新的框架和創建樣本,我也無法重現您的示例。現在它將刪除所有搜索表單,我會盡力上傳圖片以便儘快展示給您。 – SilverLink