wordpress自定義搜索

默認下,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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章