让WordPress后台搜索支持自定义域post meta-利剑分享-科技生活
利剑分享-科技生活-利剑分享-科技生活
利剑分享-科技生活

让WordPress后台搜索支持自定义域post meta

让WordPress后台搜索支持自定义域post meta

WordPress管理员后台的搜索功能本身只能对文章标题和内容进行查询搜索,但当我们有比较重要的自定义域post meta时,就需要支持搜索包含自定义域的文章。为了实现后台支持对post meta自定义域的搜索我们需要用到WordPress的三个add_filter函数posts_join、posts_where和posts_groupby即可实现该功能。以下是具体代码:

/*
添加后台搜索支持post meta自定义域查询
代码来源: www.wpzxbj.com/jiaocheng/1794.html
*/
add_filter( 'posts_join', 'posts_join_func' );
add_filter( 'posts_where', 'posts_where_func' );
add_filter( 'posts_groupby', 'posts_groupby_func' );

/**
 * 为搜索加入post meta数据
 */
function posts_join_func( $join ) {
	global $wpdb;

	if ( ! is_applicable() )
		return $join;

	$join .= "LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";

	return $join;
}

/**
 * 确保获取指定的搜索结果
 */
function posts_where_func( $where ) {
	global $wpdb, $wp;

	if ( ! is_applicable() )
		return $where;

	$where = preg_replace(
		"/($wpdb->posts.post_title LIKE '%{$wp->query_vars['s']}%')/i",
		"$0 OR $wpdb->postmeta.meta_value LIKE '%{$wp->query_vars['s']}%' ",
		$where
	);
	
	return $where;
}

/**
 * 根据文章ID组合结果,并确保不获取重复结果
 */
function posts_groupby_func( $groupby ) {
	global $wpdb;

	if ( ! is_applicable() )
		return $groupby;

	if ( empty( $groupby ) )
		$groupby = "$wpdb->posts.ID";

	return $groupby;
}


/**
 * 确保在正确的页面
 */
function is_applicable() {
	global $pagenow, $wp_query;

	// 检查是否在管理员后台
	if ( ! is_admin() )
		return false;

	// 检查是否在文章编辑页
	if ( 'edit.php' != $pagenow )
		return false;

	// 检查是否搜索关键词已设置
	if ( ! isset( $_GET['s'] ) )
		return false;

	// 检查是否在搜索页面
	if ( ! $wp_query->is_search )
		return false;

	return true;
}

代码说明:将以上代码插入主题的function.php文件即可实现自定义域post meta的搜索了。之后你可以尝试以自定义域内容来搜索看看是否能正确地查询到结果。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享