WordPress 搜索页支持搜索自定义字段的方法
LEFT JOIN 方法
此方法分为三步
1、Left Join
默认情况下,WordPress 搜索功能设置为仅搜索posts
表,为了在我们的搜索中包含自定义字段数据,我们首先需要对数据库中的postmeta
表执行左连接。
2、修改查询条件
修改 WordPress 的搜索查询包含自定义字段。
3、防止重复
此方法查询出的数据会产生重复项,我们需要在 SQL
查询中添加 DISTINCT
关键字,以防止返回重复项。
完整代码如下:
/**
* WordPress 搜索页支持搜索自定义字段的方法
* 原文地址:https://www.iowen.cn/wordpress-search-page-supports-custom-fields/
*
* 修改搜索查询的sql代码,将postmeta表左链接进去。
*/
function io_search_join( $join, $query ) {
global $wpdb;
if ( is_search() && $query->is_main_query() && !empty($query->query['s']) ) {
$join .=' LEFT JOIN '. $wpdb->postmeta . ' AS post_metas ON ' . $wpdb->posts . '.ID = post_metas.post_id ';
}
return $join;
}
add_filter('posts_join', 'io_search_join',10,2 );
/**
* 在wordpress查询代码中加入自定义字段值的查询。
*/
function io_search_where( $where, $query ) {
global $pagenow, $wpdb;
if ( is_search() && $query->is_main_query() && !empty($query->query['s']) ) {
$meta_key = "'_sites_link','_spare_sites_link','_seo_desc','_sescribe','_down_list'"; //需搜索的自定义字段键名
$where = preg_replace("/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/","({$wpdb->posts}.post_title LIKE $1) OR ((post_metas.meta_value LIKE $1) AND (post_metas.meta_key IN ({$meta_key})))", $where );
}
return $where;
}
add_filter('posts_where', 'io_search_where',10,2);
/**
* 在 SQL 查询中添加 DISTINCT 关键字,以防止返回重复项
*/
function io_search_distinct( $where, $query) {
global $wpdb;
if ( is_search() && $query->is_main_query() && !empty($query->query['s']) ) {
return 'DISTINCT';
}
return $where;
}
add_filter( "posts_distinct", "io_search_distinct",10,2 );