我有一个自定义分类法,我用它来串联帖子(系列是该分类中的一个术语) . 我想要的是在执行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 回答
好的,这是我的答案(这是一个更多的建议)
我的aproach将首先从他们的术语中最新的帖子中选择每个id,并且属于系列后的分类 .
我按d.name分组,因为你想要一个该名称的条目并使用,因为你想要一个具有最大post_date的条目
然后我选择从该查询中出现的所有id,并在
where ID in ()
子句中使用它们我无法测试这个,但这是我将如何在mysql中解决它 .