我在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语句应该有任何不同。
我错过了什么?
- 检查Taxonomy是否为复数
- 检查是否有任何插件或主题正在使用pre_get_post过滤器,该过滤器可能会修改最终查询结果
如果你有一个有大量插件的网站,但试图像任何搜索插件一样通过其功能来筛选插件,那么第二个选项可能并不实用。