2012-02-10 242 views
1

我在WordPress博客中發現了這個自定義功能,它似乎正是我所需要的。唯一的問題是我不知道要傳遞什麼作爲第二個參數。它是要求查詢但不查詢該函數的內部?我會通過什麼查詢?如何在WordPress中使用自定義搜索功能

我已經搜索了一個多小時,並且我一直在尋找類似的功能,所以這是我的WordPress新手入門。

該函數應該接受一個搜索項(第一個參數)並返回所有標題爲LIKE的搜索參數。

function custom_search($search, &$wp_query) 
{ 
    global $wpdb; 

    if (empty($search)) 
     return $search; // skip processing - no search term in query 

    $q = $wp_query->query_vars;  
    $n = ! empty($q['exact']) ? '' : '%'; 

    $search = 
    $searchand = ''; 

    foreach ((array) $q['search_terms'] as $term) { 
     $term = esc_sql(like_escape($term)); 
     $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')"; 
     $searchand = ' AND '; 
    } 

    if (! empty($search)) { 
     $search = " AND ({$search}) "; 
     if (! is_user_logged_in()) 
      $search .= " AND ($wpdb->posts.post_password = '') "; 
    } 

    return $search; 
} 
add_filter('c_search', 'custom_search', 500, 2); 
+0

我不知道爲什麼你有'c_search'在你的過濾器,但它應該是'posts_search' – nbsp 2015-07-23 22:02:58

回答

1

基本上,函數中的第二個參數是一個引用。您可以通過以下鏈接閱讀它: http://www.php.net/manual/en/functions.arguments.php

在你的情況,如果您刪除第二個參數有關的功能和定義

global $wp_query; inside the function the code should still work, you will also have to change the `add_filter('c_search', 'custom_search', 500, 1);` 

或者你可以保留的功能是和定義global $wp_query;在你的functions.php任何地方,如果它不是已經定義並傳遞作爲參數

0

您也可以通過下面的代碼使搜索:

function __search_custom($search, &$wp_query) 
{ 
    global $wpdb; 

    if (empty($search)) 
     return $search; // skip processing - no search term in query 

    $q = $wp_query->query_vars;  
    $n = ! empty($q['exact']) ? '' : '%'; 

    $search = 
    $searchand = ''; 

    foreach ((array) $q['search_terms'] as $term) { 
     $term = esc_sql(like_escape($term)); 
     $search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') OR ($wpdb->posts.post_content LIKE '{$n}{$term}{$n}'))"; 
     $searchand = ' AND '; 
    } 

    if (! empty($search)) { 
     $search = " AND ({$search}) "; 
     if (! is_user_logged_in()) 
      $search .= " AND ($wpdb->posts.post_password = '') "; 
    } 

    return $search; 
} 
add_filter('posts_search', '__search_custom', 500, 2); 

如果你想只有標題進行搜索,那麼替換$用下面的代碼搜索:

$search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";

0

其實,你應該不需要傳遞任何參數...關鍵代碼它是在最後一行;它的作用是,它增加了一個調用,將修改數據,它會得到...的論點add_filter功能是:

  1. 其中數據將被過濾
  2. 的功能點將接收並過濾數據執行的
  3. 優先級(下是第一)
  4. 參數的數目,在所定義的功能(2)將接收

所以這些參數是ALW傳遞給函數

過濾器的代碼它引用它AYS可能不是WordPress的核心的一部分,但一些自定義插件,框架或主題

,如果你想爲自己的主題創建自定義查詢

/插件/無論如何,看看http://codex.wordpress.org/Plugin_API/Filter_Reference/request