好吧,这会很大。正如你们许多人所知,鼓励不要在循环内多次查询数据库,但对于这项任务来说,不这样做是非常困难的——至少对我来说是这样。我们走吧。
在 Wordpress 中,我有六类帖子。一个页面必须调用每个类别的 3 个最新帖子并按顺序显示它们(不混合)。
要完成该任务,首先我向数据库询问类别。然后,foreach
类别我运行一个查询以使用 $wp_query 对象检索该类别名称下的最后 3 个帖子——这会产生 6 个查询。类别可以更改,当然我不想在每次更改代码时都被调用。
我尝试使用 $wpdb 使用一次性 MySQL (5.5) 查询来检索所有这些帖子和变量:
SELECT
DISTINCT $wpdb->posts.ID,
$wpdb->posts.post_title,
$wpdb->posts.post_excerpt,
$wpdb->posts.comment_count,
$wpdb->posts.guid,
$wpdb->posts.post_status,
$wpdb->posts.post_name,
$wpdb->posts.post_date,
$wpdb->posts.post_type,
$wpdb->terms.slug
FROM (
SELECT
$wpdb->posts.ID,
$wpdb->posts.post_title,
$wpdb->posts.post_excerpt,
$wpdb->posts.comment_count,
$wpdb->posts.guid,
$wpdb->posts.post_status,
$wpdb->posts.post_name,
$wpdb->posts.post_date,
$wpdb->posts.post_type,
$wpdb->terms.slug,
@num := if(@group = $wpdb->terms.slug, @num + 1, 1) as row_number,
@group := $wpdb->terms.slug
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships
ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy
ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms
ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
ORDER BY $wpdb->terms.slug ASC, $wpdb->posts.post_date DESC
) as $wpdb->posts
LEFT JOIN $wpdb->term_relationships
ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy
ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms
ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE $wpdb->posts.post_type = 'site_type'
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->term_taxonomy.taxonomy = 'site_category'
AND $wpdb->terms.slug IN ('cars', 'planes', 'motorcycles', '4x4', 'bicycles', 'jetpacks')
AND row_number <= 5
ORDER BY $wpdb->terms.slug ASC, $wpdb->posts.post_date DESC
LIMIT $total
然后,在那之后,我根据slug
. 结果就是问题。
在 PHPMyAdmin 中,我执行这个查询并且row_number
不求和,每一行的值都是 1。这使得每个“X slug 下的帖子组”都没有限制,row_number <= 5
不起作用。在自定义页面中,第一个类别(有 7 个帖子)显示超过 3 个。