WordPress默認的搜索功能搜索的是文章的標題和內容,在做網(wǎng)站開發(fā)的時候,我們可能需要根據(jù)內容的某個屬性去搜索相應的記錄,這時候用WordPress默認的搜索功能肯定是會有問題的,我們就需要通過自定義查詢的方法來實現(xiàn)這個功能了,來看一下具體步驟。
通過修改搜索表單實現(xiàn)自定義字段搜索
建立自定義查詢表單
這一步是最簡單的,不涉及PHP,直接用HTML寫一個表單即可。
<form class="pure-form" role="search" method="get" id="searchform" action="http://www.yousite.com/phonesearch/">
<input type="text" name="phone" id="s" class="pure-input-1-2" placeholder="輸入電話號碼" value="輸入電話號碼">
<button type="submit" class="button button--primary">查詢</button>
</form>
添加自定義查詢參數(shù)
因為WordPress的公共查詢參數(shù)里面沒有自定義字段,我們需要添加一個自定義查詢參數(shù),這樣我們就可以通過這個自定義查詢參數(shù)來傳遞需要查詢的數(shù)據(jù)了。
add_filter( 'query_vars', 'add_query_vars_filter' );
function add_query_vars_filter( $vars ) {
$vars[] = "phone";
return $vars;
}
需要注意的是,自定義查詢參數(shù)不能是WordPress內置查詢參數(shù)中的任何一個,否則會引起沖突。
獲取自定義查詢參數(shù)
獲取自定義查詢參數(shù)的方法和獲取內置查詢參數(shù)的方法是一樣的,都是通過 get_query_var 函數(shù)。
$phone = get_query_var('phone') ? get_query_var('phone) : '';
構建查詢參數(shù),新建查詢
獲取了自定義查詢參數(shù),我們就可以通過WordPress的meta參數(shù)查詢相應的文章了。
$args = array(
'meta_key' => 'phone'
'meta_value' => $phone,
);
$wp_query = new WP_Query($args);
輸出自定義查詢結果
這一步就是循環(huán)輸出查詢到的數(shù)據(jù)的過程,和普通的文章輸出沒有實質的區(qū)別。
while ($wp_query->have_posts()) : $wp_query->the_post();
get_template_part('content', 'stars');
endwhile;
通過修改搜索查詢參數(shù)實現(xiàn)自定義字段搜索
除了上面比較基礎的自定義表單方法,我們還可以通過修改WordPress默認的搜索查詢參數(shù)來實現(xiàn)自定義字段搜索。要做到這點,我們需要使用三個WordPress Filter來實現(xiàn)。
1、過濾 JOIN 子句
首先,我們通過posts_join Filter 來修改 JOIN 子句。
function wprs_search_posts_join( $join, $query ) {
if ( $query->is_search() ) {
global $wpdb;
$join .= " LEFT JOIN {$wpdb->postmeta} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id";
}
return $join;
}
add_filter( 'posts_join', 'wprs_search_posts_join', 10, 2 );
默認情況下,WordPress 僅搜索“posts”表,由于自定義字段存儲在“postsmeta”表中,我們需要將其包含在查詢中,這就是上一個代碼片段的作用。
2、過濾 WHERE 子句
下面我們將通過posts_where Filter 來過濾 WHERE 子句 posts_where。
function wprs_search_posts_where( $where, $query ) {
if ( $query->is_search() ) {
global $wpdb;
$where = preg_replace(
"/(s*{$wpdb->posts}.post_titles+LIKEs*('[^']+')s*)/",
"({$wpdb->posts}.post_title LIKE $1) OR ({$wpdb->postmeta}.meta_value LIKE $1)",
$where
);
}
return $where;
}
add_filter( 'posts_where', 'wprs_search_posts_where', 10, 2 );
上面的代碼告訴 WordPress 執(zhí)行搜索查詢同時查詢 meta_value 數(shù)據(jù)列,這將搜索所有自定義字段的值。如果你希望 WordPress 只搜索特定字段的值,代碼將更加復雜。
3、過濾 DISTINC 子句(可選)
最后我們可以過濾 posts_distinct Hook,如果我們在不同的字段中為同一篇文章添加了具有相同值的自定義字段,這段代碼可防止出現(xiàn)重復的搜索結果。
function wprs_search_posts_distinct( $where, $query ) {
if ( $query->is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'wprs_search_posts_distinct', 10, 2 );
把上面三段代碼放到主題的 functions.php 文件或者插件中的適合文件中,我們就可以讓WordPress默認搜索表單搜索自定義字段的值了。


