【问题标题】:WP_Query returns random IDs on taxonomy queries with posts_per_page argumentWP_Query 使用 posts_per_page 参数返回分类查询的随机 ID
【发布时间】:2016-10-11 23:53:41
【问题描述】:

我正在尝试从特定的 WooCommerce 类别中获取最新的产品 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),则帖子 ID 的顺序似乎正确。

但是,这可以正常工作,因为我认为它应该可以在我的开发服务器上工作。这发生在生产服务器上(使用 WPengine 作为托管服务提供商和 MySQL 5.6.32)。

欢迎任何建议,谢谢!

【问题讨论】:

    标签: mysql wordpress


    【解决方案1】:

    这似乎是因为如果您尝试使用非唯一数据执行 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2012-10-06
      • 2021-08-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多