最新公告

    Sorry, no posts matched your criteria.

巧妙使用 WordPress 搜索支持自定义字段数据

作者 : 黑域吧 本文共2019个字,预计阅读时间需要6分钟 发布时间: 2020-09-26 共292人阅读

WordPress 强大之一就是支持自定义字段,例如作为电商系统,商品的最重要的属性就是商家编码,以后进行一些店铺之间商品复制操作,甚至做供应量,也是需要靠这个属性来进行操作,我们也可以为文章页添加各种各样的自定义字段,这些自定义字段是存在 wp_postmeta 表内,而 WordPress 默认的搜索是不支持搜索 wp_postmeta 表内的数据的,所以想让 WordPress 默认搜索支持搜索自定义字段数据,我们可以将以下代码添加到当前主题的 functions.php 文件中:

 add_action('posts_search', function($search, $query){
        global $wpdb;
        if ($query->is_main_query() && !emptyempty($query->query['s'])) {
            $sql    = " OR EXISTS (SELECT * FROM {$wpdb->postmeta} WHERE post_id={$wpdb->posts}.ID and meta_key = 'product_no' and meta_value like %s)";
            $like   = '%' . $wpdb->esc_like($query->query['s']) . '%';
            $search .= $wpdb->prepare($sql, $like);
        }
        return $search;
    },2,2);

以上就是用于来支持 WordPress 搜索文章自定义字段数据的代码,如果你要使用或者用于检索自定义字段,需要修改以上代码中的“product_no”替换成你所需的相关字段即可。

高级用法

使用wordpress搜索网站内容,只会把关键词与文章标题或内容匹配搜索,这一点用户体验不是很好,如果有这么个需求,产品类型的文章,使用了自定义字段添加产品编号,而用户想通过产品编号搜索产品,是搜索不出结果的,原因是wordpress只会搜索posts数据表,而自定义字段数据是保存在postmeta数据表。

那么是否可以让WordPress搜索功能支持自定义字段匹配,显然是可以的,通过修改搜索查询的sql代码,把postmeta数据表关联进去就可以实现,下面是实现的代码:
1、链接查询
作用:修改搜索查询的sql代码,将postmeta表左链接进去。

/**
 * Join posts and postmeta tables
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */
function cf_search_join( $join ) {
	global $wpdb;
	if ( is_search() ) {
		$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
	}
	return $join;
}
add_filter('posts_join', 'cf_search_join' );

2、查询代码
作用:在wordpress查询代码中加入自定义字段值的查询。

/**
 * Modify the search query with posts_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */
function cf_search_where( $where ) {
	global $pagenow, $wpdb;
	if ( is_search() ) {
		$where = preg_replace("/(s*".$wpdb->posts.".post_titles+LIKEs*('[^']+')s*)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
	}
	return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

3、去重
作用:搜索结果很有可能有重复的,所以需要去重,很简单,在sql语句中加入DISTINCT关键字。

/**
 * Prevent duplicates
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */
function cf_search_distinct( $where ) {
	global $wpdb;
	if ( is_search() ) {
		return "DISTINCT";
	}
	return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

把上面的代码一起添加到当前主题的functions.php文件即可。

提示:
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!邮箱:(332547532@qq.com)
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到审核区发布,分享有金币奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务 请大家谅解!
5. 如有链接无法下载、失效或广告,请点击右下方联系站长,可领回失去的金币,并额外有奖!
6. 如遇到加密压缩包,默认解压密码请在"下载框架提示方寻找",如遇到无法解压的请联系管理员!
黑域吧资源网 » 巧妙使用 WordPress 搜索支持自定义字段数据

发表评论

现在加入黑域吧资源网,