WP_QUERY生成的SQL语句未生成预期结果

时间:2015-09-11 作者:Thomas

我正试图改变WP_Querypre_get_posts 动作挂钩,用于过滤返回的帖子,具体取决于内置categorypost_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”,还注册了两个内置分类法categorypost_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, 但在实际执行之前。

1 个回复
SO网友:majick

它看起来像这个部分:

AND (wptom_posts.post_status = \'publish\' 
OR wptom_posts.post_author = 1 
AND wptom_posts.post_status = \'private\') 
完全不受两个不同查询条件的约束。。。

也许原始代码应该是第1部分的三个条件:

array( 
    \'relation\' => \'AND\',
    array(  \'taxonomy\' => \'category\',
            \'field\' => \'slug\',
            \'operator\' => \'IN\'),
    array( \'taxonomy\' => \'post_tag\',
            \'field\' => \'slug\',
            \'operator\' => \'IN\'),
    array( \'terms\' => array(\'private\') )
),
我在这里猜测了一点,但没有测试它,但这就是我要尝试的。

相关推荐

如何将WordPress配置为与Microsoft SQL Server数据库对话?

我们正在我们的intranet站点上构建WordPress站点,并希望将其连接到Microsoft SQL Server。我已经在IIS上下载并配置了PHP和PHP管理器。我还从键入此线程标题时弹出的已回答问题列表中下载了SQL Server DLL。我按照指示在PHP文件夹中下载了这些DLL。当我启动服务器地址以安装WordPress时,系统会提示我提供SQL DB名称、用户名、密码和DB主机名。我还下载了wp-db抽象插件,将wp-db抽象化。php文件放入WordPress文件保存的文件夹中,按照我