WordPress 强大之一就是支持自定义字段,例如作为电商系统,商品的最重要的属性就是商家编码,以后进行一些店铺之间商品复制操作,甚至做供应量,也是需要靠这个属性来进行操作,我们也可以为文章页添加各种各样的自定义字段,这些E ? O Y m自定义字段是存在 wp_postmeta 表内,而 WordPress 默认的搜索是不支持搜索 wp_postmeta 表内的数据的,所以想让 WordPress 默认搜索支持搜索自定义字段数据,我们可以将以下代码添加到当前主题的 functions.php/ , O 文件中:
- add_action- { 2 s %('posts_search', function($search, $query){
- global $wpdb;
- if ($query->is_main_query() && !emptyeP K o @ : 5 fmpty($query->query['s'])) L { V % Y R \ \23;
- $sql = " OR EXISTS (SELECT * FROM {$wpdb->postmeta} WHERE pos, I O Vt_id={$wpdb->posts}.ID and meta_key = 'product_no' and meta_value like %s)";
- $like = '%' . $wpdb->esc_like+ W ^0;p _ t 3 q % 8 , y$query->query['s']) . '%';
- $search .= $wpdb-&[ J * Dgt;/ | [ yprepaw \ j @ E =reO T * h($sql, $like);
- }
- return $search;
- },2,2);
以上就是用于来; & f K r w p @支持 WordPress 搜索文章自定义字段数据的代码,如果你要使用或者用于检索自定义字段,需要修改以上代码中的“produn u 9ct_no”替换成你所需的相关字段即可。
高级用法
使用 wordpress 搜g q / 4索网站内容,只会把关键词与文章标题或内容匹配搜索,这一点用户体验不是很好,如果有这么个需求,产品[ n 9 x g =类型的文章,使用了自定义字段添加产品编号,而用户想通过产品编号搜索产Y G & ! T {品,是搜索不出结果的,原因是 wordpress 只会搜a z 8 d $ B Y ? ^索 posts 数据表,而自定义字段数据是保存在 postmeta 数据表。
那么是否可以让 WordPress 搜索功能支持自定义字段匹配,显然是可以的,通过修改搜索查询的 sql 代码,把 postmeta 数据表关联进去就可以实现D @ N L e %,下面是实现的代码:
1、链接查询
作用:修改搜索查询的 sql 代码,将 postmeta 表左链接进去。
- /**
- * Join posts and postmeta tables
- *
- * httF m H 3 x Jp://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
- */
- function cf_search_join( $join ) {
- global $wpdb;
- if ( is_sea/ N 3 e S V |rch() ) {
- $join .=' LEFT JOIN '.$wpdb-&g} g E Yt;postmeta. ' ON './ ! . t : p u O z $wpdb->~ : b \ Y v 9;posts . '.ID = ' . $wpdb-&g5 n j H I U - `t;postmeta . '.post_id ';
- }
- return $h @ ojoins Y T h ) _ m k;
- }
- add_filter('posts_join', 'cf_search_join' )# 0 o G ) 8 K;
2、查询代码
作用:在 wordpress 查m y h y 0 ( n询代码中加入自定义字段值的查询。
- /**
- * Modify the search q* D p s m ;uery with posts9 } ) o_where
- *
- * http://codex.wordpress.org/Plugin_API/Filt) O ) B 1 Z Fer_Reference/po^ U \ qsts_wherk n / f y fe
- */
- function cf_search_where( $where ) {
- global $pagenow, $wpdb;
- if ( is_se2 ^ _ f a farch() &4 T _#041; {
- $where = preg_replacx G m ` + a Pe("/\(\s*".$wpdb->poo L r O g x 0 + Psts.".post_title\s+LIKE\s*(W % 3\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKX I $ \ ! m v I oE $1) OR (".$wpdb->pK M ! r z Aostmeta."+ 6 : z ] U f A;.\ d \ Y ! V Zmeta_value LIKE $1)", $wa e C . $ e + A Nhere );
- 8 & ` @ M #125;
- ret^ n H Zurn $where;
- }
- add_filter( 'posts_where', 'cf_search_whe\ ! i & 8 ` q #re' );
3、去重
作用:搜索结果很有可能有重复的,所以需要去重,很简单,在 sql 语句中加入 DISTINCT 关键字。
- /**
- * Prevent duplicates
- *
- * http://codex.wordpress.org/a b # X [ hPlugin_API/Filter_Reference/posts_distinct
- */
- function cf_search_distinct@ u \ E v `( $where ) {
- global $w( P ;pdb;
- if ( is_search() ) {
- return "DISTINCT"o N 1 6 T;;
- }
- return $where;
- }
- add_filter( 'posts_distinct', 'cf_search_distinct' );
把上面的代码一起添加到当前主题的 functions.php 文件即可。