首页 文章

按WordPress循环中的自定义分类法显示日期的最后一篇文章

提问于
浏览
5

我有一个自定义分类法,我用它来串联帖子(系列是该分类中的一个术语) . 我想要的是在执行WordPress循环时将这些捆绑的帖子视为特殊情况 .

只显示系列中的第一篇文章(具有最近日期的帖子),并且应将所有其他不属于自定义分类中的术语的帖子视为普通帖子 . 除了自定义系列分类法之外,还可以对帖子进行标记或分类(因此最多包含三种分类法,包括自定义分类法) . 循环应包含固定数量的帖子(例如,WordPress后端中设置的首页上的帖子数量) .

我对如何对这些帖子进行分组感到茫然,部分原因是因为所有数据都在不同的表格中,并且因为每个条目都属于多个分类法 . 当然循环遍历posts数组,在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

我也读过this tutorial,但我不确定它适用于这种情况 .

总结一下:在循环中我只想显示属于自定义分类中的术语的最新帖子(按post_date排序),并在循环中排除该分类中的其他帖子 . 该循环还包含不属于自定义分类的常规帖子,并且这两种类型可能属于多个类别并具有标记 .

1 回答

  • 2

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

    我的aproach将首先从他们的术语中最新的帖子中选择每个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分组,因为你想要一个该名称的条目并使用,因为你想要一个具有最大post_date的条目

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

    我无法测试这个,但这是我将如何在mysql中解决它 .

相关问题