WordPress教程

巧妙使用 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 文件即可。

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

已有 248 人购买
查看演示升级 VIP立刻购买

收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!