如何显示相同类别的相关帖子?
4 个回答
- 投票数
-
- 2011-10-02
一种可能性:
$related = get_posts( array( 'category__in' => wp_get_post_categories( $post->ID ), 'numberposts' => 5, 'post__not_in' => array( $post->ID ) ) ); if( $related ) { foreach( $related as $post ) { setup_postdata($post); /*whatever you want to output*/ } wp_reset_postdata(); }
参考:
根据
WP_Query()
重新编写的答案:$related = new WP_Query( array( 'category__in' => wp_get_post_categories( $post->ID ), 'posts_per_page' => 5, 'post__not_in' => array( $post->ID ) ) ); if( $related->have_posts() ) { while( $related->have_posts() ) { $related->the_post(); /*whatever you want to output*/ } wp_reset_postdata(); }
One possibility:
$related = get_posts( array( 'category__in' => wp_get_post_categories( $post->ID ), 'numberposts' => 5, 'post__not_in' => array( $post->ID ) ) ); if( $related ) { foreach( $related as $post ) { setup_postdata($post); /*whatever you want to output*/ } wp_reset_postdata(); }
Reference:
Answer re-written based on
WP_Query()
:$related = new WP_Query( array( 'category__in' => wp_get_post_categories( $post->ID ), 'posts_per_page' => 5, 'post__not_in' => array( $post->ID ) ) ); if( $related->have_posts() ) { while( $related->have_posts() ) { $related->the_post(); /*whatever you want to output*/ } wp_reset_postdata(); }
-
**请小心使用变量名!**您正在使用全局`$post`来执行查询,然后在`foreach`循环的同一上下文中重新定义`$post`.**Be very careful with your variable names!** You're using a global `$post` to perform your query, then redefining `$post` in the same context within your `foreach` loop.
- 0
- 2011-10-02
- EAMann
-
@EAMann-您通常是正确的-但是,以我的经验,例如,将`setup_postdata()`与$post以外的任何东西一起使用不会为the_title()提供正确的输出.理论上,`wp_reset_postdata()`应该负责重置$post.@EAMann - you are generally right - however in my experience, using `setup_postdata()` with anything other than `$post` does not deliver the right output for `the_title()` for instance. `wp_reset_postdata()` should in theory take care of resetting $post.
- 0
- 2011-10-02
- Michael
-
这是因为setup_postdata()本身将$post引用为全局变量.而不是使用`get_posts()`,您应该[定义`WP_Query`的自定义实例](http://wordpress.stackexchange.com/questions/1753/when-should-you-use-use-wp-query-vs-query-posts-vs-get-posts)并使用它来获取您的帖子.它将为您设置发布数据,并使`the_title()`等以应有的方式工作.That's because `setup_postdata()` itself references `$post` as a global. Instead of using `get_posts()` you should [define a custom instance of `WP_Query`](http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts) and use that to get your posts. It will set up the post data for you as well as make `the_title()` et al work the way they're supposed ti.
- 1
- 2011-10-03
- EAMann
-
@EAMann这是一个比较老的帖子,但是如果您可以编写有关如何使用自定义查询以及所有正确方法正确执行此操作的答案,将不胜感激@EAMann This is a rather old post, but it would be appreciated if you could write an answer on how to do that correctly with the custom query and all
- 0
- 2015-11-25
- GiantCowFilms
-
- 2018-07-02
这是另一个干净且非常灵活的选项:
将此代码放入您的functions.php文件中
function example_cats_related_post() { $post_id = get_the_ID(); $cat_ids = array(); $categories = get_the_category( $post_id ); if(!empty($categories) && is_wp_error($categories)): foreach ($categories as $category): array_push($cat_ids, $category->term_id); endforeach; endif; $current_post_type = get_post_type($post_id); $query_args = array( 'category__in' => $cat_ids, 'post_type' => $current_post_type, 'post__not_in' => array($post_id), 'posts_per_page' => '3' ); $related_cats_post = new WP_Query( $query_args ); if($related_cats_post->have_posts()): while($related_cats_post->have_posts()): $related_cats_post->the_post(); ?> <ul> <li> <a href="<?php the_permalink(); ?>"> <?php the_title(); ?> </a> <?php the_content(); ?> </li> </ul> <?php endwhile; // Restore original Post Data wp_reset_postdata(); endif; }
现在,您可以使用以下方法在站点中的任何地方简单地调用该函数:
<?php example_cats_related_post() ?>
您可能需要删除列表元素或根据需要设置其样式.
*编辑-您将以下内容更改为:在查询中将此post_not_in更改为此帖子__not_in
Here another clean and very flexible option:
Put this code in your functions.php file
function example_cats_related_post() { $post_id = get_the_ID(); $cat_ids = array(); $categories = get_the_category( $post_id ); if(!empty($categories) && is_wp_error($categories)): foreach ($categories as $category): array_push($cat_ids, $category->term_id); endforeach; endif; $current_post_type = get_post_type($post_id); $query_args = array( 'category__in' => $cat_ids, 'post_type' => $current_post_type, 'post__not_in' => array($post_id), 'posts_per_page' => '3' ); $related_cats_post = new WP_Query( $query_args ); if($related_cats_post->have_posts()): while($related_cats_post->have_posts()): $related_cats_post->the_post(); ?> <ul> <li> <a href="<?php the_permalink(); ?>"> <?php the_title(); ?> </a> <?php the_content(); ?> </li> </ul> <?php endwhile; // Restore original Post Data wp_reset_postdata(); endif; }
Now you can simply call the function anywhere in your site using:
<?php example_cats_related_post() ?>
You may want to remove the list elements or style them as per your need.
*Edit - you to change this: post_not_in to this post__not_in in your query
-
它只显示一个帖子.是否可以在类别页面上显示同一类别的所有帖子?It is showing only one post. Is it possible to show all posts of the same category on a category page?
- 0
- 2019-08-29
- Rahul
-
- 2018-08-20
此答案可确保相关帖子按匹配的标签数排序.
例如,如果某篇文章有3个标签,而另一篇文章的3个标签完全相同,则该文章应出现在列表顶部. 次要排序应按发布日期进行,以便使用更新的内容.
/** * Select content with common tags. * Sort so content with multiple matching tags are at the top. * Secondary sort on most recent content first. * * @param $post_id * @param int $limit * @return array */ function related_posts($post_id, $limit = 5) { global $wpdb; $query = "SELECT TOP %d x.object_id as ID FROM ( SELECT TOP 10 tr1.object_id, COUNT(tr1.term_taxonomy_id) AS common_tag_count FROM {$wpdb->term_relationships} AS tr1 INNER JOIN {$wpdb->term_relationships} AS tr2 ON tr1.term_taxonomy_id = tr2.term_taxonomy_id WHERE tr2.object_id = %d GROUP BY tr1.object_id HAVING tr1.object_id != %d ORDER BY COUNT(tr1.term_taxonomy_id) DESC ) x INNER JOIN {$wpdb->posts} p ON p.ID = x.object_id ORDER BY common_tag_count DESC, p.post_date DESC;"; $query = $wpdb->prepare($query, $limit, $post_id, $post_id); $ids = $wpdb->get_col($query); $posts = []; foreach($ids as $id) { $posts[] = get_post($id); } return $posts; }
这里的内部查询用于选择标签匹配度最高的内容,然后外部查询仅用于按发布日期进行二级排序.
请注意,此查询是针对SQL Server编写的,因此某些语法可能需要更新(例如TOP与LIMIT).
This answer makes sure that related posts are ordered by how many tags match.
For example if an article has 3 tags and there is another article that has the exact same 3 tags it should appear at the top of the list. Secondary sorting should be by post date so newer content is favored.
/** * Select content with common tags. * Sort so content with multiple matching tags are at the top. * Secondary sort on most recent content first. * * @param $post_id * @param int $limit * @return array */ function related_posts($post_id, $limit = 5) { global $wpdb; $query = "SELECT TOP %d x.object_id as ID FROM ( SELECT TOP 10 tr1.object_id, COUNT(tr1.term_taxonomy_id) AS common_tag_count FROM {$wpdb->term_relationships} AS tr1 INNER JOIN {$wpdb->term_relationships} AS tr2 ON tr1.term_taxonomy_id = tr2.term_taxonomy_id WHERE tr2.object_id = %d GROUP BY tr1.object_id HAVING tr1.object_id != %d ORDER BY COUNT(tr1.term_taxonomy_id) DESC ) x INNER JOIN {$wpdb->posts} p ON p.ID = x.object_id ORDER BY common_tag_count DESC, p.post_date DESC;"; $query = $wpdb->prepare($query, $limit, $post_id, $post_id); $ids = $wpdb->get_col($query); $posts = []; foreach($ids as $id) { $posts[] = get_post($id); } return $posts; }
The inner query here is to select the content with the most matching tags, and then the outer query is just used to to apply secondary sorting by post date.
Note this query is written for SQL Server so some syntax may need updating (e.g. TOP vs LIMIT).
-
- 2019-12-02
您可以使用此代码从同一类别获取相关帖子
$args = array( 'category__in' => wp_get_post_categories( get_queried_object_id() ), 'posts_per_page' => 5, 'orderby' => 'rand', 'post__not_in' => array( get_queried_object_id() ) ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : ?> <ul class=""> <!-- the loop --> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li> <h6> <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> </h6> </li> <?php endwhile; ?> <!-- end of the loop --> </ul> <?php wp_reset_postdata(); ?> <?php endif; ?>
并使用此代码从相同的标签获取相关帖子
$tags = wp_get_post_terms( get_queried_object_id(), 'post_tag', ['fields' => 'ids'] ); $args = [ 'post__not_in' => array( get_queried_object_id() ), 'posts_per_page' => 5, 'orderby' => 'rand', 'tax_query' => [ [ 'taxonomy' => 'post_tag', 'terms' => $tags ] ] ]; $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : ?> <ul class=""> <!-- the loop --> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li> <h6> <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> </h6> </li> <?php endwhile; ?> <!-- end of the loop --> </ul> <?php wp_reset_postdata(); ?> <?php endif; ?>
you can use this code to get related posts from the same category
$args = array( 'category__in' => wp_get_post_categories( get_queried_object_id() ), 'posts_per_page' => 5, 'orderby' => 'rand', 'post__not_in' => array( get_queried_object_id() ) ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : ?> <ul class=""> <!-- the loop --> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li> <h6> <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> </h6> </li> <?php endwhile; ?> <!-- end of the loop --> </ul> <?php wp_reset_postdata(); ?> <?php endif; ?>
and use this code to get related posts from the same tags
$tags = wp_get_post_terms( get_queried_object_id(), 'post_tag', ['fields' => 'ids'] ); $args = [ 'post__not_in' => array( get_queried_object_id() ), 'posts_per_page' => 5, 'orderby' => 'rand', 'tax_query' => [ [ 'taxonomy' => 'post_tag', 'terms' => $tags ] ] ]; $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : ?> <ul class=""> <!-- the loop --> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <li> <h6> <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"> <?php the_title(); ?> </a> </h6> </li> <?php endwhile; ?> <!-- end of the loop --> </ul> <?php wp_reset_postdata(); ?> <?php endif; ?>
是否可以显示与当前帖子相同类别的相关帖子?