我有一个自定义的帖子类型“csl\\u playlist\\u manager”,其中一个元字段是“available\\u to\\u all”。我还有一个自定义的层次分类法“csl\\U source”,它标识每个播放列表的所有者。我需要一个查询,允许我找到特定来源的所有合适的播放列表,其中;“合适”;表示播放列表可以是“全部可用”,也可以是“源”或“源”的子项的匹配。
我已经成功地为源及其子级创建了一个ID列表,它处理了分类层次结构问题。我的查询当前如下所示:
$args = array (
\'post_type\' => \'csl_playlist_manager\',
\'post_status\' => \'publish\',
\'relation\' => \'OR\',
\'tax_query\' => array(
array(
\'taxonomy\' => \'csl_source\',
\'field\' => \'term_id\',
\'terms\' => $strTax,
\'operator\' => \'IN\',
),
),
\'meta_query\' => array(
array(
\'key\' => \'_csl_playlist_available_to_all\',
\'value\' => 1,
\'compare\' => \'=\',
),
),
\'nopaging\' => \'true\',
);
var\\u dump显示结果查询为:
["request"]=>
string(531) "SELECT wp_posts.* FROM wp_posts LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND (
wp_term_relationships.term_taxonomy_id IN (26,34,35,36,37,38,39,40,41,42,43,44)
) AND (
( wp_postmeta.meta_key = \'_csl_playlist_available_to_all\' AND wp_postmeta.meta_value = \'1\' )
) AND wp_posts.post_type = \'csl_playlist_manager\' AND ((wp_posts.post_status = \'publish\')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC "
当我需要将“AND”设置为“OR”时,“AND”将显示为逻辑运算符。我搜索了很多地方,但没有找到如何实现我想要实现的简单目标的例子。智慧受到赞赏。
最合适的回答,由SO网友:Sally CJ 整理而成
您想做什么-使用OR
与的关系tax_query
和meta_query
参数,即<tax queries> OR <meta queries>
而不是<tax queries> AND <meta queries>
不幸的是,SQL中的命令(没有自定义和可能复杂的查询)在WP_Query
目前,因此\'relation\' => \'OR\'
在查询参数中$args
数组)将无法工作,甚至无法执行任何操作。
然而,你(我)能做的是:Turn that metadata into a custom taxonomy 哪一种更适合将一组帖子组合在一起,就像您使用元数据将帖子组合为;播放列表可用“;(?),此外,分类术语也可以简单到1
和0
, 也不一定需要像这样的标题Movies
和Web Design
. 您甚至可以创建一个带有;是或否“;复选框,然后更新文章的分类术语。(我的意思是,如果您不喜欢默认的分类法UI/选择器…)
例如,注册一个名为playlist_available
, 然后将这些术语添加到该分类中:1
(“播放列表可用”)和0
(“播放列表不可用”)-虽然我认为你可能不需要后者。。?
然后对于所有现有的有元数据的帖子_csl_playlist_available_to_all
设置为1
, 从帖子中删除该元数据,然后将帖子分配给1
中的术语playlist_available
分类学
然后当你WP_Query
, 没有必要meta_query
只需在tax_query
参数/数组:
$args = array(
\'post_type\' => \'csl_playlist_manager\',
\'tax_query\' => array(
\'relation\' => \'OR\',
array( // selects posts that are in this taxonomy
\'taxonomy\' => \'csl_source\',
\'field\' => \'term_id\',
\'terms\' => $strTax,
),
array( // OR the ones with the playlist available
\'taxonomy\' => \'playlist_available\',
\'field\' => \'slug\',
\'terms\' => \'1\', // or whatever the slug is
),
),
// ... your other args.
);
现在,这将为您提供预期的结果,并且查询的运行速度也将比
meta_query
最终可能会出现各种连接子句——在小型站点上,您可能不会注意到明显的性能提升;但当你的网站变得更大(许多帖子、选项、插件数据、流量/用户等)时,你会这样做<不过有一点免责声明,我远不是性能专家。:)