我正试图改变WP_Query
在pre_get_posts
动作挂钩,用于过滤返回的帖子,具体取决于内置category
和post_tag
分类法。
我希望查询返回的唯一帖子要么两个分类法都没有注册,要么两个分类法都没有为帖子设置术语,或者,最后一种情况是,两个分类法都有特定的值。
法典中有规定WP_Query
为此目的应使用“嵌套分类法”的页面(see here).
虽然在我的特殊情况下,它不起作用-以下是我的代码:
// In a function hooked on \'pre_get_posts\' action
$query->set(\'post_type\', array(\'post\',\'wpgdacces_acces\', \'page\'));
$query_tax_param = array(
\'relation\' => \'OR\',
array(
\'relation\' => \'AND\',
array( \'taxonomy\' => \'category\',
\'field\' => \'slug\',
\'terms\' => array( \'private\' ),
\'operator\' => \'IN\'),
array( \'taxonomy\' => \'post_tag\',
\'field\' => \'slug\',
\'terms\' => array(\'private\'),
\'operator\' => \'IN\')
),
array(
\'relation\' => \'AND\',
array( \'taxonomy\' => \'category\',
\'field\' => \'slug\',
\'operator\' => \'NOT EXISTS\'
),
array( \'taxonomy\' => \'post_tag\',
\'field\' => \'slug\',
\'operator\' => \'NOT EXISTS\'
)
)
);
在此之前,我已经注册了自定义post类型“wpgdacces\\u acces”,还注册了两个内置分类法
category
和
post_tag
对于
page
岗位类型。
我正在本地环境中,在带有默认主题的WP 4.3安装上测试该查询。在这个设置中,我有3个标准帖子,其中只有一个对类别和标签都有“私有”术语。其余2个员额的职类术语为“未叙级”。我还有3页,没有为这两种分类法设置术语。在我的自定义帖子类型“wpgdacces\\u acces”中,我有2篇帖子,这两种分类法都没有注册。
因此,在主页上,查询被更改为显示3种帖子类型post
, page
和“wpgdacces\\u acces”(上面块中的第一行代码)。因此,我应该看到1篇文章+3页+2篇wpgdacces\\u acces文章。但唯一炫耀的元素是将类别和标签都设置为“私有”的标准帖子。
非常奇怪:当我分别使用这两个条件修改并运行查询时(一方面修改查询以仅获取未设置分类的帖子,另一方面修改查询以获取分类设置为私有的帖子),它工作得非常好。
这让我认为WP_Query
之后pre_get_posts
可能是哪里出了问题。给你,上面印着echo $GLOBALS[\'wp_query\']->request;
在“wp\\u footer”挂钩上:
SELECT SQL_CALC_FOUND_ROWS wptom_posts.ID
FROM wptom_posts
INNER JOIN wptom_term_relationships
ON (wptom_posts.ID = wptom_term_relationships.object_id)
INNER JOIN wptom_term_relationships
AS tt1
ON (wptom_posts.ID = tt1.object_id)
WHERE 1=1
AND (
(
wptom_term_relationships.term_taxonomy_id IN (7)
AND
tt1.term_taxonomy_id IN (8)
)
OR
(
NOT EXISTS (
SELECT 1
FROM wptom_term_relationships
INNER JOIN wptom_term_taxonomy
ON wptom_term_taxonomy.term_taxonomy_id = wptom_term_relationships.term_taxonomy_id
WHERE wptom_term_taxonomy.taxonomy = \'category\'
AND wptom_term_relationships.object_id = wptom_posts.ID
)
AND
NOT EXISTS (
SELECT 1
FROM wptom_term_relationships
INNER JOIN wptom_term_taxonomy
ON wptom_term_taxonomy.term_taxonomy_id =
wptom_term_relationships.term_taxonomy_id
WHERE wptom_term_taxonomy.taxonomy = \'post_tag\'
AND wptom_term_relationships.object_id = wptom_posts.ID
)
)
) AND wptom_posts.post_type
IN (\'post\', \'wpgdacces_acces\', \'page\')
AND (wptom_posts.post_status = \'publish\'
OR wptom_posts.post_author = 1
AND wptom_posts.post_status = \'private\')
GROUP BY wptom_posts.ID
ORDER BY wptom_posts.post_date
DESC LIMIT 0, 10
您看到上面的SQL语句中有什么错误吗?我想找出SQL语句中的错误。如果我知道怎么了,也许我可以使用
WP_Query
提供用于在之后修改查询的筛选器
pre_get_posts
, 但在实际执行之前。