元查询子句内的Tax Query子句?

时间:2020-06-23 作者:Max

我需要通过WP\\U查询对象运行以下查询:

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 )  
INNER JOIN wp_postmeta mt1 ON ( wp_posts.ID = mt1.post_id )  
WHERE 1=1  
AND 
(
  (
    wp_term_relationships.term_taxonomy_id IN (47) /* current season */
    AND wp_postmeta.meta_key = \'show_is_creation\' AND wp_postmeta.meta_value = \'1\'
  ) 
  OR (
    mt1.meta_key = \'show_in_ontour\' AND mt1.meta_value = \'1\'
    AND wp_postmeta.meta_key = \'show_is_creation\' AND wp_postmeta.meta_value = \'1\'
  )
) 
AND wp_posts.post_type = \'show\' 
AND ((wp_posts.post_status = \'publish\')) 

GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order ASC;
所以,我需要进行税务查询inside 元查询子句。对于“meta\\u query”参数,这似乎是不可能的,如下所示:

$meta_query = [
     \'relation\' => \'OR\',
     [
       \'relation\'           => \'AND\',
       \'current_season_clause\' => [
         \'tax_query\' => [
           \'taxonomy\' => \'season\',
           \'operator\' => \'IN\',
           \'terms\'    => [47],
         ],
       ],
       \'is_creation_clause\' => [
         \'key\'     => \'show_is_creation\',
         \'compare\' => \'=\',
         \'value\'   => 1,
       ],
     ],
     [
       \'relation\'           => \'AND\',
       \'is_creation_clause\' => [
         \'key\'     => \'show_is_creation\',
         \'compare\' => \'=\',
         \'value\'   => 1,
       ],
       \'is_ontour_clause\'   => [
         \'key\'     => \'show_in_ontour\',
         \'compare\' => \'=\',
         \'value\'   => 1,
       ],
     ],
 ];
实现这一目标的最佳方式是什么?(不运行原始SQL查询)。我应该使用过滤器来修改WHERE语句吗?

谢谢

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

因此,我需要在元查询子句中运行税务查询。对于“meta\\u query”参数,这似乎是不可能的,如下所示:

正确,使用的参数无法执行您想要执行的操作WP_Query 同时保持数据按原样存储。查询已经非常昂贵/运行速度很慢,如果您可以添加分类术语查询,它将更加昂贵。

相反,这些值不应该存储为post meta,而应该存储为分类术语。您可以使用私有/隐藏的分类法来实现这一点,并且可以告诉ACF使用该分类法来存储值。

例如,ashow_in 具有以下术语的分类法on_touris_creation.

然后可以使用标准tax_query 条款您还可以创建辅助术语,例如not_on_tour, 让你拿着超贵的NOT IN 查询并将其替换为超便宜/快速版本。

此外,您可以使用has_term, e、 g.:


// should we show this post on the homepage?
if ( has_term( [ \'homepage\' ], \'show_on\' ) {
    //
}
这比post meta的查询速度要快得多,在大型网站上,这可以比post meta的查询速度快数千倍。

您还可以将其中一些操作自动化,例如,在我参与的许多网站上show_on_homepage 使用自动将术语添加到每个帖子中save_post 钩然后,用户可以删除该术语并将其替换为hide_on_homepage 学期这也是一种让用户管理突出页面区域的好方法,比如show_in_homepage_carousel 学期

在主页上支持这一点所需的只是一个名为hidden_post_markers, 和中的一个片段functions.php 像这样:

add_action( \'pre_get_posts\', function( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( \'hidden_post_markers\', \'show_on_homepage\' );
    }
} );
作为一般指南:

如果您需要通过一段数据来查找帖子或查询帖子,则该数据应在分类法中表示为一个术语。如果只有在您已经知道帖子ID时(例如在显示帖子时)才能访问关于帖子的一段数据,则使用post meta,您可以将数据存储在这两个术语中,您可以存储一个简化的查询术语版本,在post meta for display中有一个更详细的版本,您可以将布尔数据存储为术语,最简单的方法是使用_true_false 附加到名称中,或者只是测试术语的存在,post meta表不是为搜索帖子而设计的,除了主要的性能问题之外,分类法/术语系统是为搜索帖子、在查询中过滤帖子等而设计的meta_query 随着帖子数量的增加,查询变得更加昂贵,而且变得昂贵/慢/快

相关推荐

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

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