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

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

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

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

高级用法

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

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

  1. /**
  2.  * Join posts and postmeta tables
  3.  *
  4.  * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
  5.  */
  6. function cf_search_join( $join ) {
  7. 	global $wpdb;
  8. 	if ( is_search() ) {
  9. 		$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
  10. 	}
  11. 	return $join;
  12. }
  13. add_filter('posts_join', 'cf_search_join' );

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

  1. /**
  2.  * Modify the search query with posts_where
  3.  *
  4.  * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
  5.  */
  6. function cf_search_where( $where ) {
  7. 	global $pagenow, $wpdb;
  8. 	if ( is_search() ) {
  9. 		$where = preg_replace("/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
  10. 	}
  11. 	return $where;
  12. }
  13. add_filter( 'posts_where', 'cf_search_where' );

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

  1. /**
  2.  * Prevent duplicates
  3.  *
  4.  * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
  5.  */
  6. function cf_search_distinct( $where ) {
  7. 	global $wpdb;
  8. 	if ( is_search() ) {
  9. 		return "DISTINCT";
  10. 	}
  11. 	return $where;
  12. }
  13. add_filter( 'posts_distinct', 'cf_search_distinct' );

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

原创文章,作者:DavidWu,如若转载,请注明出处:https://www.davidwu.net/archives/76637

WordPress安全防护插件
服务项目 服务内容 收费标准(元)
开发定制 WordPress主题/插件开发定制 (以最终需求为准)
主题/插件汉化 汉化团队WordPress主题/插件,翻译率95% (以标的主题/插件的句子数量为准)
服务器环境配置 基于您现有服务器,搭建配置网站运行环境,结合我们多年来实战经验,可完美支持WordPress等PHP程序运行,并配置伪静态规则、优化目录权限等问题。服务器我们强烈推荐使用Linux系统。 100元/次
网站托管 若贵站目前尚无技术人员,无法完成服务器环境配置,可选择我们的网站托管服务,直接交付正常运行的WordPress站点,并且无需担心服务器的后续维护工作,一切都由我们来帮您完成。 标配套餐:1000元/年/站点 高配套餐:联系客服获取
网站加速优化 从服务器后端配置优化到WordPress数据库缓存、前端页面缓存、JS和CSS压缩合并,全方位优化网站加载速度,实现秒开。(此服务仅针对(云)服务器/VPS) 500元/次(仅站内优化200元/次)
主题配置 本站所有主题均支持,可快速实现,若有任何问题可以咨询客服解决,若您希望我们提供配置服务,可选购此服务。 英文主题安装 60元/次 汉化主题安装 30元/次
HTTPS配置 HTTPS已经不断普及,并且有着更高的安全性以及SEO上的优待。该服务收取的为服务费,SSL证书产生的费用请自行承担。 100元/次
网站搬家 迁移网站所有文件和数据库信息、网站相关配置的调整、以及迁移中的疑难问题故障排除。 标准收费:500元/次 若网站数据量大,需协商
网站运维 提供整站的运维服务,保证网站正常运行。包含:网站故障定位及排除、网站数据备份和恢复、网站攻击及木马等问题的处理等 标准收费:2000元/年 IP 5000以上需协商

发表评论

电子邮件地址不会被公开。 必填项已用*标注

51建站客服微信二维码
点击这里购买