默認下,wordpress的搜索範圍只有文章的標題和文章內容,無法搜索自定義字段中的內容,現實情況是很多情況下我們可能會要搜索自定義字段中的內容。
如果只是想搜索一到兩個自定義字段中的內容,可以使用wordpress的內置函數 meta_query變量。
<!– 代碼 –>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Query arguments $args = array( 'post_type' => 'post', 'post_status' => 'publish', ); $args['meta_query'][] =array( 'key' => 'city', 'value' => $city, 'compare' => 'LIKE', ); $args['meta_query'][] =array( 'key' => 'state', 'value' => $state, 'compare' => 'LIKE', ); $query = new WP_Query($args ); if ( $query->have_posts() ):while ( $query->have_posts() ) :$query->the_post(); // Do loop here endwhile; endif; |
這個方法並不適合於搜索更多及至全部的自定義字段,因爲如果你有很多個自定義字段,這上請求將會變得非常的龐大,wordpress執行起來也同樣的要花很多時間。根據我的測試,10個自定義字段,就花了超過1分鐘的時間還沒有搜索得結果。
所以,我寫了一個解決方案,不使用meta_query寫複雜的請求,而是使用簡單的SQL語句,查詢出所有的必須的post_id,於是一切就直接了當了:
<!– 代碼二 –>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
global $wpdb; // 如果你使用自定義搜索框 // $keyword = sanitize_text_field( $_POST['keyword'] ); //如果你使用wordpress默認搜索框
$keyword = get_search_query(); $keyword = "%{$keyword}%"; // 搜索所有的自定義字段 $post_ids_meta = $wpdb->get_col($wpdb->prepare( " SELECT DISTINCT post_id FROM {$wpdb->postmeta} WHERE meta_value LIKE '%s' ", $keyword ) ); // 在文章標題或文章內容中搜索 $post_ids_post = $wpdb->get_col($wpdb->prepare( " SELECT DISTINCT ID FROM {$wpdb->posts} WHERE post_title LIKE '%s' OR post_content LIKE '%s' ", $keyword, $keyword ) ); $post_ids = array_merge($post_ids_meta, $post_ids_post ); // 查詢參數 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'post__in' => $post_ids, ); $query = new WP_Query($args ); if ( $query->have_posts() ):while ( $query->have_posts() ) :$query->the_post(); // Do loop here endwhile; endif; |
在上面的代碼中,做了自定義搜索框的查詢和wrodpress默認搜索框兩種方式,可以根據需要註釋掉其中一個。
上面的代碼中,搜索了所有文章自定義字段,文章標題,文章內容,返回是符合的文章的ID組成的數組。然後再使用wp_query做了一個自定義查詢,使用這個方法,可以很方便地使用模板標籤把文章內容顯示出來。
你可以把代碼放到主題文章中的search.php文章中,去替換wordpress默認的搜索框。你也可以把這代碼粘貼到一個自定義搜索框中。
參考資料:http://www.deluxeblogtips.com/2012/04/search-all-custom-fields.html