用于分类值或自定义POST类型元字段的WP_QUERY

时间:2020-10-13 作者:Wayne McHugh

我有一个自定义的帖子类型“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”将显示为逻辑运算符。我搜索了很多地方,但没有找到如何实现我想要实现的简单目标的例子。智慧受到赞赏。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

您想做什么-使用OR 与的关系tax_querymeta_query 参数,即<tax queries> OR <meta queries> 而不是<tax queries> AND <meta queries> 不幸的是,SQL中的命令(没有自定义和可能复杂的查询)在WP_Query 目前,因此\'relation\' => \'OR\' 在查询参数中$args 数组)将无法工作,甚至无法执行任何操作。

然而,你(我)能做的是:Turn that metadata into a custom taxonomy 哪一种更适合将一组帖子组合在一起,就像您使用元数据将帖子组合为;播放列表可用“;(?),此外,分类术语也可以简单到10, 也不一定需要像这样的标题MoviesWeb 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 最终可能会出现各种连接子句——在小型站点上,您可能不会注意到明显的性能提升;但当你的网站变得更大(许多帖子、选项、插件数据、流量/用户等)时,你会这样做<不过有一点免责声明,我远不是性能专家。:)

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post