我正在尝试从特定的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)上发生。
欢迎任何意见,谢谢!
最佳答案
好吧,这似乎是由于以下事实造成的:如果您尝试对非唯一数据执行ORDER BY,结果可能会有所不同,并且是预期的。我猜想尤其是在集群MySQL环境(我认为WPengine使用的集群环境)中。在这种情况下,post_date在多个帖子中是相同的,因为我使用了导入程序来创建它们。当我尝试按价格对产品进行排序并且某些产品具有相同的价格时,发生了同样的事情。
因此,为了解决WP_Query中的此问题,我使用了fallback到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
关于mysql - WP_Query返回带有posts_per_page参数的分类查询的随机ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39977663/