让WordPress支持搜索自定义字段数据



最近在给客户做 WordPress 主题时遇到这样一个问题:客户需要在搜索的时候支持对自定义字段的搜索。

经过搜索,发现这样几种方法:

支持搜索一个自定义字段

举个例子,假如我们新建了一个自定义字段 maosiji,这时,我们需要在本站搜索时搜索到此自定义字段的内容。

那么,只需要在 functions.php 里添加如下代码:

add_action('posts_search', function($search, $query){
	global $wpdb;

	if ($query->is_main_query() && !empty($query->query['s'])) {

		$sql    = " OR EXISTS (SELECT * FROM {$wpdb->postmeta} WHERE post_id={$wpdb->posts}.ID and meta_key = 'maosiji' and meta_value like %s)";
		$like	= '%' . $wpdb->esc_like($query->query['s']) . '%';

		$search	.= $wpdb->prepare($sql, $like);
	}
	return $search;
},2,2);

保存后,即可实现搜索此自定义字段值的需求。

以上方法是 我爱水煮鱼 提供的,经测试 WordPress 最新版(5.3.2)依然有效。

支持搜索全部自定义字段

如果我们此时不仅有一个自定义字段 maosiji,还有其他很多个自定义字段,如:maotimemaoipmaoviews 等等,并且都需要在本站搜索里搜索到。

那么,只需要在 functions.php 里添加如下代码:

/*
 * 修改搜索查询的sql代码,将postmeta表左链接进去。
 * */
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' );

/*
 * 在wordpress查询代码中加入自定义字段值的查询。
 * */
function cf_search_where( $where ) {
	global $pagenow, $wpdb;
	if ( is_search() ) {
		$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 );
	}
	return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

/*
 * 搜索结果很有可能有重复的,所以需要去重,很简单,在sql语句中加入DISTINCT关键字。
 * */
function cf_search_distinct( $where ) {
	global $wpdb;
	if ( is_search() ) {
		return "DISTINCT";
	}
	return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

以上方法是 ashuwp 提供的,经测试 WordPress 最新版(5.3.2)依然有效。


<< 使wordpress网站注册时支持中文用户名 wp_editor() wordpress集成TinyMCE编辑器 >>
工作中
  • 作者 建站迷

    建站迷

    让天下没有难做的网站!
    解决中小型企业的无站之伤。



没有账号? 忘记密码?

社交账号快速登录