本篇文章更新時間:2019/02/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持


自訂欄位的資訊是儲存在 prefix + _postmeta 資料表中。

內建預設的搜尋功能不會找這邊,所以如果處理到客製化內容類型(Custom Post Type)的時候記得要考慮「可搜尋」這部分,以免建了很多資料都無法被找到!

下面簡短程式碼為網路上常看到的讓 Post meta data(自訂欄位) 可搜尋的範例:

function metakey_search_query( $query ) {
  if ( $query->is_search ) {
    $meta_query_args = array(
        'relation' => 'OR',//多欄位時他們的邏輯判斷
      array(
        'key' => 'your_key1',//自訂欄位的名稱(key)值
        'value' => '搜尋內容',
        'compare' => 'LIKE',//比對方式,參照 SQL 的運算元
      ),
        array(
        'key' => 'your_key2',
        'value' => '搜尋內容',
        'compare' => 'LIKE',
      )
    );
    $query->set('meta_query', $meta_query_args);
  };
}
add_filter( 'pre_get_posts', 'metakey_search_query');

看似沒問題,但其實真套上後會有問題,無法找到半篇文章! 資料庫 SELECT Query 最後被組成的時候變成判斷除基本標題內文搜尋外,連自訂欄位的資料都成為「必要」條件(AND),導致沒法找到結果。

針對這個必要(AND)條件,有人提出的解法是去硬取代它,參考解法:Using meta query ('meta_query') with a search query ('s')

網上翻攪好一會後終於在AFC 討論區看到有人也反應這問題而且是滿乾淨有條理的做法:Search WordPress by Custom Fields without a Plugin

跟此文作者一樣,我覺得沒必要單一事件就套外掛,而其他人給的解答又實在太硬幹,不能說準確達到「可搜尋」的目標,最多就是「頁面輸出文章增加自訂欄位條件」而已。

文章中有針對使用的方法說明,可以去看看! 主要針對 posts_join(新增metadata為搜尋條件) 、 posts_where (設定比對條件)、 posts_distinct (排除重複結果),這三個事件處理。

看那篇作者文章下方的留言也可以發現,這困擾讓不少人了。而解這問題要從三個 Filter 去處理,真不知道到底算小還是大問題。

總之,以上屬微硬漢(幹)深入探討版,想讓這一切簡單點也是有外掛可以幫忙的XD

  • Search Everything 顧名思義強化搜尋功能,可以包含搜尋自訂欄位的值
  • Relevanssi – A Better Search 較工程化一點的搜尋強化工具,可以預先建立索引,提供一些事件(Hook)來捕捉自訂欄位的值(預設無選項)

其他參考資料:


Share:

作者: Chun

WordPress 社群貢獻者、開源社群推廣者。專注於 WordPress 外掛開發、網站效能最佳化、伺服器管理,以及 iDempiere 開源 ERP 導入與客製開發。曾參與 WordCamp Taipei 等社群活動,GitHub Arctic Code Vault Contributor。提供資訊顧問、WordPress 開發教學、主機最佳化與企業 ERP 整合服務。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon