让我们将问题分成三部分:从数据库中检索相关帖子,对它们进行排序并显示结果。
让我们首先检索当前帖子的类别并找到它们的ID:
$categories = get_the_terms( get_the_ID(), \'news-category\' );
foreach ( $categories as $category ) {
$category_ids[] = $category->term_id;
}
我们对标签也这样做:
$tags = get_the_terms( get_the_ID(), \'news-tags\' );
foreach ( $tags as $tag) {
$tag_ids[] = $tag->term_id;
}
然后,我们构建一组查询参数(我们稍后将其馈送到
WP_Query
-电话):
$related_args = array(
\'post_type\' => array(
\'news\',
),
\'post_status\' => \'publish\',
\'posts_per_page\' => -1, // Get all posts
\'post__not_in\' => array( get_the_ID() ), // Hide current post in list of related content
\'tax_query\' => array(
\'relation\' => \'AND\', // Make sure to mach both category and term
array(
\'taxonomy\' => \'news-category\',
\'field\' => \'term_id\',
\'terms\' => $category_ids,
),
array(
\'taxonomy\' => \'news-tags\',
\'field\' => \'term_id\',
\'terms\' => $tag_ids,
),
),
);
最后,我们运行查询,该查询为我们提供
$related_all = new WP_Query( $related_args );
请注意,此查询检索与“过滤器”匹配的所有帖子,因为我们稍后将进行排序。如果我们现在只查询4篇帖子,这些可能不是最相关的。
旁注:上述查询相当繁重,因为它(可能)检索了大量帖子。当我为一个客户项目创建了一个相关的帖子部分(也是一个新闻部分)时,我按日期而不是相关性排序。这允许您对从数据库检索的帖子数量设置限制(更改-1
到4
在您的情况下,并添加\'orderby\' => array( \'date\' => \'DESC\' )
到$related_args
-阵列)。如果您想坚持在重叠处排序,我建议您在查询参数中添加一个日期过滤器,或者将结果数量限制为某个有限值,然后从该集合中检索最相关的帖子
按照上一步进行后排序,$related_all
是一个WP_Query
-对象我们按如下方式访问实际帖子,并将其存储在$related_all_posts
:
$related_all_posts = $related_all->posts;
这为我们提供了一个更容易使用的阵列。然后,我们循环该数组中的所有结果。根据代码中的注释,当循环遍历结果时,我们会找到与(相关)帖子相关的标签,找到它们的ID,并将其与
$tag_ids
(关于主帖子)找到之前的内容,看看有多少重叠使用
array_intersect()
:
foreach($related_all_posts as $related_post){
// Find all tags of the related post under consideration
$related_post_tags = get_the_terms( $related_post->ID, \'news-tags\' );
foreach ( $related_post_tags as $related_post_tag ) {
$related_tag_ids[] = $related_post_tag->term_id; // Save their IDs in a query
}
// Find overlap with tags of main post (in $tag_ids) using array_intersect, and save that number in
// an array that has the ID of the related post as array key.
$related_posts_commonality[$related_post->ID] = count(array_intersect($related_tag_ids, $tag_ids));
}
然后,我们使用
arsort()
.
arsort($related_posts_commonality);
最后,我们使用
array_slice()
:
$related_posts_commonality = array_slice($related_posts_commonality, 0, 4);
您可以使用
array_keys
, e、 g.:
$related_posts_IDs = array_keys($related_posts_commonality);
要实际显示帖子,您可以采取两种方法。您可以使用
$related_posts_commonality
要循环查看的结果的数组
WP_Query
(即。,
$related_all
), 将匹配的帖子(按正确的顺序)保存在一个新的数组或对象中,并再次循环这些帖子以供显示。因为这不需要额外的查询,所以它可能是最有效的查询。然而,这也是一种痛苦。
因此,您也可以简单地使用我们刚刚找到的ID($related_posts_IDs
) 运行另一个查询。
$related_sorted = WP_query(array(\'post__in\' => $related_posts_IDs));
然后,你可以使用
loop (
while ($related_sorted->have_posts())
等等)使用以下函数浏览并显示结果
the_title()
和
the_content()
.