我有一个自定义分类法,我用它来串联帖子(系列是该分类中的一个术语)。我想要的是在执行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排序),并在循环中排除该分类中的其他帖子。该循环还包含不属于自定义分类的常规帖子,并且这两种类型可能属于多个类别并且具有标记。
答案 0 :(得分: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中解决它的方法。