WordPress使post_meta能进行搜索

两种方式,一种类似于拼接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
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称常用语 夸夸
夸夸
还有吗!没看够!
表情代码图片

    暂无评论内容