本篇文章更新時間:2019/02/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
自訂欄位的資訊是儲存在 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)來捕捉自訂欄位的值(預設無選項)
其他參考資料: