5

我有一个自定义分类法,我用它来捆绑系列帖子(系列是该分类法中的一个术语)。我希望在执行 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 排序),并在循环中排除该分类中的其他帖子。该循环还包含不属于自定义分类法的常规帖子,并且两种类型都可能属于多个类别并具有标签。

4

1 回答 1

2

好的,这是我的答案(这更像是一个建议)

我的方法是首先从他们任期内最新的帖子中选择每个 id,并且属于分类学帖子系列。

select * from wp_posts where ID in(
select ID from
(
select wp_posts.ID , wp_posts.post_date, d.name from wp_posts as a
join wp_term_relationships as b on ( a.ID = b.object_id)
join wp_term_taxonomy as c on (b.term_taxonomy_id = c.term_taxonomy_id)
join  wp_terms as d on (c.term_id = d.term_id)
where c.taxonomy = 'post-series'
group by d.name 
having (wp_posts.post_date = max(wp_posts.post_date))
)tmp)

我按 d.name 分组,因为您想要该名称的一个条目并使用 have,因为您想要一个具有最大 post_date 的条目

然后我选择从该查询中出现的所有 id 并在where ID in ()子句中使用它们

我无法对此进行测试,但这就是我在 mysql 中解决它的方法。

于 2013-03-04T23:14:59.693 回答