我不怀疑你的tax_query
让你失望,但实际上tag
参数为。single_tag_title()
返回name 而不是鼻涕虫。
所有标记和类别查询都转换为tax_query
在WP_Query
在传递给WP_Tax_Query
类来构建SQL查询的相对字符串。在验证之前以及在获取所传递术语的术语ID之前,术语名称和段塞会被清理干净。(出于兴趣,请阅读为什么不应使用术语名称和name
a中的参数tax_query
, 检查我的答案here)
现在,鼻涕虫should 始终使用小写字母,多个单词之间用连字符分隔。你把一个名字当作鼻涕虫传递。因为术语名称与术语slug列中的任何内容都不匹配(,因为您已经告诉tax_query
要查看slug列,请执行以下操作:,WP_Tax_Query
接受术语无效且不存在,因此只需退出并返回空字符串。这就是最大的缺陷所在(我认为这是一个应该修复的bug)。WP_Tax_Query
将空SQL联接字符串发送回WP_Query
, WP_Query
错误地解读这句话,好像从来没有tax_query
并继续构建并执行SQL,而不使用join子句。然后意外返回all 不管帖子在哪里,我认为它应该不返回任何帖子。这就是你看到的
因此,让我们来看一个解决方案,并清理您的代码,使其更加可靠
首先,你的pre_get_post
行动
添加一个只针对前端的检查,否则后端查询也会受到影响
设置is_tag()
到当前实例
获取当前tax_query
并对其进行修改,以添加帖子格式部分,并将其作为新的tax_query
您可以将代码调整为以下内容:(我使用闭包,但您可以恢复到您问题中的旧样式;-))
add_action(\'pre_get_posts\', function ($q)
{
if ( !is_admin() // Only targets front end queries
&& $q->is_main_query() // Only targets the main query
&& $q->is_tag() // Only targets tag archive pages
) {
// Gets the current tax_query
$tax_query_obj = $q->tax_query->queries;
// Add the post format query part to the current tax_query
$tax_query_obj[] = [
\'taxonomy\' => \'post_format\',
\'field\' => \'slug\',
\'terms\' => [\'post-format-aside\'],
\'operator\' => \'NOT IN\'
];
//Build a proper tax query
$tax_query = [
\'relation\' => \'AND\',
$tax_query_obj
];
// Set the modified tax_query
$q->set( \'tax_query\', $tax_query );
// Set any additional parameters here except tag parameters
}
}, PHP_INT_MAX );
对于您的自定义查询,只需使用
get_queried_object_id()
然后在
tax_query
使用我们的帖子格式。您可以在参数中尝试以下操作:(
由于新的短数组语法,需要PHP 5.4+)([]
))
$args = [
\'tax_query\' => [
[
\'taxonomy\' => \'post_tag\', // Default tag taxonomy
\'terms\' => get_queried_object_id(), // Gets current tag archive tag ID
],
[
\'taxonomy\' => \'post_format\',
\'field\' => \'slug\',
\'terms\' => \'post-format-aside\'
],
],
// Rest of your arguments excluding tag parameter
];