1. David Wu首页
  2. WordPress
  3. WordPress建站教程

WordPress 自定义 WP_Query 循环如何支持 tax_query or meta_query 参数-WordPress建站教程

WordPress 的循环函数都是 and 方式链接,对于单个的 meta_query 或者 tax_query 字段内部才能使用 or,那么如果我们想要实现 tax_query or meta_query 的关系,WordPress 默认是不提供支持的。

WordPress 的循环函数都是 and 方式链接,对于单个的 meta_query 或者 tax_query 字段内部才能使用 or,那么如果我们想要实现 tax_query or meta_query 的关系,WordPress 默认是不提供支持的。

WordPress WP_Query 自定义

子凡最近为了满足泪雪网的功能需求,查找了大量的教程,甚至想过用两个 WP_Query 循环来实现这样的功能,后来通过 Google 搜索到一个相关的答案,为此子凡整理并分享出来,这样当你在使用 WordPress 的 WP_Query 来自定义循环,并且完美的支持 tax_query or meta_query。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * Modify WP_Query to support \'meta_or_tax\' argument
 * to use OR between meta- and taxonomy query parts.
 * use \'_meta_or_tax\' => true in wp_query array
 */
add_filter( \'posts_where\', function( $where, \\WP_Query $q ){
	$tax_args = isset( $q->query_vars[\'tax_query\'] ) ? $q->query_vars[\'tax_query\'] : null;
	$meta_args = isset( $q->query_vars[\'meta_query\'] ) ? $q->query_vars[\'meta_query\'] : null;
	$meta_or_tax = isset( $q->query_vars[\'_meta_or_tax\'] ) ? wp_validate_boolean( $q->query_vars[\'_meta_or_tax\'] ) : false;
	// Construct the "tax OR meta" query
	if( $meta_or_tax && is_array( $tax_args ) &&  is_array( $meta_args )  )   {
		global $wpdb;
		$field = \'ID\';// Primary id column
		$sql_tax = get_tax_sql(  $tax_args,  $wpdb->posts, $field );// Tax query
		$sql_meta = get_meta_sql( $meta_args, \'post\', $wpdb->posts, $field );// Meta query
		// Modify the \'where\' part
		if( isset( $sql_meta[\'where\'] ) && isset( $sql_tax[\'where\'] ) ) {
			$where = str_replace( [ $sql_meta[\'where\'], $sql_tax[\'where\'] ], \'\', $where );
			$where .= sprintf( \' AND ( %s OR  %s ) \', substr( trim( $sql_meta[\'where\'] ), 4 ), substr( trim( $sql_tax[\'where\']  ), 4 ) );
		}
	}
	return $where;
}, PHP_INT_MAX, 2 );

使用方式则是在 WP_Query 的参数数组里面添加一条\’_meta_or_tax\’ => true,简单的举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$args = array(
	\'post_status\'			=> \'publish\',
	\'order\'					=> \'ASC\',
	\'nopaging\'				=> true,
	\'_meta_or_tax\'			=> true, //用于支持 tax_query OR meta_query 查询
	\'tax_query\'				=> array(
		\'relation\'		=> \'OR\',
		array(
			\'taxonomy\'	=> \'category\',
			\'field\'		=> \'id\',
			\'terms\'		=> array(1,2,3),
			\'operator\'	=> \'IN\'
		), 
	),
	\'meta_query\'			=> array(
		array(
			\'key\'		=> \'Headline\',
			\'value\'		=> \'\'
			\'compare\'	=> \'!=\'
		),
	)
);
$query = new WP_Query( $args );

这可能是一个非常小众的需求,但是用起来还是非常的爽,而且对于有相关功能需求的来说,以及用两次循环甚至三次循环来搞定简直不要不要的,子凡我要的就是最极简最极致的功能,也要最简单高效的代码。

更多关于 WordPress 优化及疑问可以添加 QQ 群:255308000

除非注明,否则均为泪雪博客原创文章,禁止任何形式转载

本文链接:https://zhangzifan.com/wordpress-wp_query-tax_query-or-meta_query.html

原创文章,作者:泪雪博客,如若转载,请注明出处:https://www.davidwu.net/archives/129681

服务项目 服务内容 收费标准(元)
开发定制 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以上需协商

发表评论

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