WP_Query使用posts_per_page参数返回分类法查询的随机ID

时间:2016-10-11 12:50:58

标签: mysql wordpress

我正在尝试从特定的WooCommerce类别中获取最新的产品ID。出于某种原因,在每个页面加载时,我得到的是不同的产品ID,而不是最新的产品ID。

这是WP_Query参数:

array(
    'post_type' => 'product',
    'posts_per_page' => 5,
    'tax_query' => array(
        array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => 'a-product-category' 
        )
    ),
    'orderby' => 'date',
    'order' => 'ASC'
)

这将生成以下SQL查询:

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
)
WHERE 1=1
AND (
    wp_term_relationships.term_taxonomy_id IN (259,260,262)
)
AND wp_posts.post_type = 'product'
AND (
    wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private'
)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date ASC
LIMIT 0, 5

就像我说的那样,返回的帖子ID总是有些不同(尽管它们来自正确的类别)。我的理解是这个查询的正确行为是它应该从指定的类别返回五个最新的帖子。

我直接在SQL服务器上执行查询以排除任何WordPress或插件问题,并且仍然有随机的帖子ID。

如果我删除tax_query(删除与wp_term_relationship相关的SQL命令)或将posts_per_page设置为-1(删除LIMIT 0,5),则post id似乎顺序正确。

然而,这可行,因为我认为它应该在我的开发服务器上工作。这发生在生产服务器上(使用WPengine作为托管提供程序和MySQL 5.6.32)。

欢迎任何建议,谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,这似乎是因为如果您尝试使用非唯一数据进行ORDER BY,结果可能会有所不同并且是预期的。特别是在集群MySQL环境中(我认为WPengine使用)我想。在这种情况下, post_date 在多个帖子中是相同的,因为我使用导入器来创建它们。当我尝试按价格对产品进行分类并且某些产品具有相同的价格时,同样的事情发生了。

所以为了解决WP_Query中的这个问题,我使用了回退到order_by参数:

'order_by' => 'date ID'

转换为:

ORDER BY wp_posts.post_date ASC, wp_posts.ID ASC

可在此处找到更多信息:https://bugs.mysql.com/bug.php?id=69732