创建一个URL以显示包含两个分类法术语的帖子

时间:2021-03-16 作者:JakeParis

我想展示一个有两个共同分类术语的帖子档案。例如,我想显示所有同时包含术语的帖子;酱汁“;和;奶酪“;在自定义中food 分类学

诀窍是我想使用url来实现这一点。最接近我的是:

example.com?food[]=sauce&food[]=cheese
在检查来自pre_get_posts 过滤器,我可以看到:

WP_Tax_Query::__set_state(array(
   \'queries\' => 
  array (
    0 => 
    array (
      \'taxonomy\' => \'food\',
      \'terms\' => 
      array (
        0 => \'sauce\',
        1 => \'cheese\',
      ),
      \'field\' => \'slug\',
      \'operator\' => \'IN\',
      \'include_children\' => true,
    ),
  ),
所以我改变了operatorAND 像这样:

add_action(\'pre_get_posts\', function($query) {

    $query->tax_query->queries[0][\'operator\'] = \'AND\';

});
但我的结果总是包含至少有一个术语的帖子,而不是包含所有术语的帖子。

根据Query Monitor,主查询是这样的(您可以看到,它正在查找具有两个术语id中的任何一个的帖子)。

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (6,9) )
那么,我如何制定一个url来只获取同时包含分类术语的帖子呢?

2 个回复
最合适的回答,由SO网友:JakeParis 整理而成

当我注册分类法时,我省略了“重写”的参数,然后默认为true. 因此,默认情况下,WordPress希望将url重写为/food/whatever/. 棘手的是,它确实接受了这种格式?food=whatever , 但如果加上加号,就不会接受这种格式的两个不同术语。

解决方案是指定的重写参数register_taxonomy() 像这样:

register_taxonomy( \'food\', \'post\', [
   ...
   \'rewrite\' => [
      \'slug\' => \'filter\',
      \'with_front\' => false,
   ],
   ...
]);
然后我可以使用/food/sauce+cheese 比如@jdm2112和文档中指定的。

SO网友:jdm2112

看起来您可以定义AND 带有URL参数的逻辑运算符,特别是添加+"E;在您这样的条款之间:url?taxonomy=term1+term2

这将确保只返回包含列出的所有条款的帖子。

示例:https://example.com/blog?food=sauce+cheese

[tax_query] => WP_Tax_Query Object
        (
        [queries] => Array
            (
                [0] => Array
                    (
                        [taxonomy] => food
                        [terms] => Array
                            (
                                [0] => sauce
                            )
                        [field] => slug
                        [operator] => IN
                        [include_children] => 1
                    )
                [1] => Array
                    (
                        [taxonomy] => food
                        [terms] => Array
                            (
                                [0] => cheese
                            )
                        [field] => slug
                        [operator] => IN
                        [include_children] => 1
                    )
            )
        [relation] => AND
请注意,术语之间的关系是明确的和。

在本地测试中,我可以确认返回的帖子仅包含这两个术语。