具有相同参数的WP_Query在前端和后端生成不同的SQL语句



我在Wordpress中构建了一个快捷代码,用于显示特定自定义分类法中的媒体文件。当使用";Shortcake(Shortcode UI(";以在经典编辑器中渲染代码。然而,在前端,它没有产生任何结果。

我发现WP_Query生成的SQL语句在后端和前端是不同的,尽管参数是相同的。我不明白为什么会发生这种事。

以下是$args:

$args = array(
'post_type' => 'attachment',
'post_status' => 'any',
'tax_query' => array(
array(
'taxonomy' => 'media_folder',
'field'    => 'term_id',
'terms'    => 385
),
),
);
$the_query = WP_Query($args);

当我打印_r($the_query(并查看Shortcode UI包装器中的结果时,这是我看到的最后一个查询,它按预期工作:

/*BACK END*/
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)
LEFT JOIN wp_posts AS p2
ON        (
wp_posts.post_parent = p2.id)
WHERE     1=1
AND       (
wp_term_relationships.term_taxonomy_id IN (385) )
AND       wp_posts.post_type = 'attachment'
AND       ( ( (
wp_posts.post_status <> 'trash'
AND       wp_posts.post_status <> 'auto-draft' )
OR        (
wp_posts.post_status = 'inherit'
AND       (
p2.post_status <> 'trash'
AND       p2.post_status <> 'auto-draft'))))
GROUP BY  wp_posts.id
ORDER BY  wp_posts.post_date DESC
LIMIT     0, 5

在网站的前端,这里是生成的最后一个查询,它不会产生任何结果:

/*FRONT END*/
SELECT    SQL_CALC_FOUND_ROWS wp_posts.id
FROM      wp_posts
LEFT JOIN wp_posts AS p2
ON        (
wp_posts.post_parent = p2.id)
WHERE     1=1
AND       (
0 = 1 )
AND       wp_posts.post_type = 'attachment'
AND       ( ( (
wp_posts.post_status <> 'trash'
AND       wp_posts.post_status <> 'auto-draft' )
OR        (
wp_posts.post_status = 'inherit'
AND       (
p2.post_status <> 'trash'
AND       p2.post_status <> 'auto-draft' ) ) ) )
GROUP BY  wp_posts.id
ORDER BY  wp_posts.post_date DESC
LIMIT     0, 5

查询的前端版本省略了对"wp_term_relationships"表的任何引用,我一辈子都想不出原因。或者为什么在给定完全相同的参数的情况下,SQL语句应该有任何不同。

我错过了什么?

  1. 检查Taxonomy是否为复数
  2. 检查是否有任何插件或主题正在使用pre_get_post过滤器,该过滤器可能会修改最终查询结果

如果你有一个有大量插件的网站,但试图像任何搜索插件一样通过其功能来筛选插件,那么第二个选项可能并不实用。

相关内容

最新更新