两种方式,一种类似于拼接sql,一种是使用WordPress的meta_query,推荐使用meta_query方式,简单高效。
使用meta_query
// 在搜索中包含自定义字段
function custom_search_include_meta( $query ) {
if ( $query->is_search ) {
// 将需要搜索的自定义字段添加到这个数组中
$meta_keys = array( 'custom_field_1', 'custom_field_2', 'custom_field_3' );
// 在搜索中包含自定义字段
$query->set( 'meta_query', array(
'relation' => 'OR',
array(
'key' => 'custom_field_1',
'value' => $query->query_vars['s'],
'compare' => 'LIKE'
),
array(
'key' => 'custom_field_2',
'value' => $query->query_vars['s'],
'compare' => 'LIKE'
),
array(
'key' => 'custom_field_3',
'value' => $query->query_vars['s'],
'compare' => 'LIKE'
)
));
}
}
add_action( 'pre_get_posts', 'custom_search_include_meta' );
拼接sql
1、拼接方式一:
/**
* WordPress 搜索页支持搜索自定义字段的方法
* 修改搜索查询的sql代码,将postmeta表左链接进去。
*/
function 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', 'search_join',10,2 );
/**
* 在wordpress查询代码中加入自定义字段值的查询。
*/
function 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 ) OR ((post_metas.meta_value LIKE ) AND (post_metas.meta_key IN ({$meta_key})))", $where );
}
return $where;
}
add_filter('posts_where', 'search_where',10,2);
/**
* 在 SQL 查询中添加 DISTINCT 关键字,以防止返回重复项
*/
function 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", "search_distinct",10,2 );
2、拼接方式二:
/**
* WordPress 搜索页支持搜索自定义字段的方法
*
* EXISTS 方法查询自定义字段
*/
function posts_search_where($search, $query){
global $wpdb;
if (is_search() && $query->is_main_query() && !empty($query->query['s'])) {
$meta_key = "'_sites_link','_spare_sites_link','_seo_desc','_sescribe','_down_list'"; //需搜索的自定义字段键名
$sql = " OR EXISTS (SELECT * FROM {$wpdb->postmeta} WHERE post_id={$wpdb->posts}.ID AND meta_key IN ({$meta_key}) AND meta_value like %s)";
$like = '%' . $wpdb->esc_like($query->query['s']) . '%';
$where = $wpdb->prepare($sql, $like);
$search = preg_replace("/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/","({$wpdb->posts}.post_title LIKE ) {$where}", $search );
}
return $search;
}
add_action('posts_search', 'posts_search_where',10,2);
© 版权声明
THE END
暂无评论内容