我想展示一个有两个共同分类术语的帖子档案。例如,我想显示所有同时包含术语的帖子;酱汁“;和;奶酪“;在自定义中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,
),
),
所以我改变了
operator
到
AND
像这样:
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来只获取同时包含分类术语的帖子呢?
最合适的回答,由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和文档中指定的。