我有一个自定义分类法,我用它来捆绑系列帖子(系列是该分类法中的一个术语)。我希望在执行 WordPress 循环时将这些捆绑的帖子视为特殊情况。
只有系列中的第一个帖子(日期最近的帖子)应显示,所有其他不属于自定义分类中的术语的帖子应视为普通帖子。除了自定义系列分类法之外,帖子还可以标记或分类(因此最多三个分类法,包括自定义分类法)。循环应该包含固定数量的帖子(例如,在 WordPress 后端设置的首页上的帖子数量)。
我不知道如何对这些帖子进行分组,部分原因是所有数据都在不同的表中,而且每个条目都可以属于多个分类法。当然,循环遍历帖子数组,在 MySQL 调用之后丢弃系列中较旧的帖子是可能的,但在这种情况下,如果不对数据库进行额外的查询,就很难维持固定数量的帖子。
所以我想实现一个纯SQL解决方案。我一直在尝试使用posts_clauses
钩子。我相信,下面的这个查询在一系列中返回具有最高 ID 的帖子,而不是日期,并且对数据库相当繁重。
$clauses['fields'] .= ", $wpdb->posts.ID AS postID, (SELECT $wpdb->terms.term_id
FROM $wpdb->posts, $wpdb->term_taxonomy, $wpdb->term_relationships, $wpdb->terms
WHERE $wpdb->posts.ID=postID
AND $wpdb->term_taxonomy.taxonomy='post-series'
AND $wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id
AND $wpdb->posts.ID=$wpdb->term_relationships.object_id
AND $wpdb->terms.term_id=$wpdb->term_taxonomy.term_id
ORDER BY $wpdb->posts.post_date DESC
LIMIT 0,1) AS uniqueID";
$clauses['groupby'] = "IFNULL(uniqueID,$wpdb->posts.ID)";
基于上面的条款,WordPress 构造了以下 SQL 查询:
SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_posts.ID AS postID,
(SELECT wp_terms.term_id FROM wp_posts, wp_term_taxonomy, wp_term_relationships, wp_terms
WHERE wp_posts.ID=postID
AND wp_term_taxonomy.taxonomy='post-bundles'
AND wp_term_relationships.term_taxonomy_id=wp_term_taxonomy.term_taxonomy_id
AND wp_posts.ID=wp_term_relationships.object_id
AND wp_terms.term_id=wp_term_taxonomy.term_id
ORDER BY wp_posts.post_date DESC LIMIT 0,1)
AS uniqueID FROM wp_posts
WHERE 1=1
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')
GROUP BY IFNULL(uniqueID,wp_posts.ID)
ORDER BY wp_posts.post_date DESC
LIMIT 0, 10
我也读过这个教程,但我不确定它是否适用于这种情况。
总结一下:在循环中,我只想显示属于自定义分类中的术语的最新帖子(按 post_date 排序),并在循环中排除该分类中的其他帖子。该循环还包含不属于自定义分类法的常规帖子,并且两种类型都可能属于多个类别并具有标签。