Câu trả lời:
Một khả năng:
$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();
}
Tài liệu tham khảo:
Trả lời viết lại dựa trên 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();
}
setup_postdata()
với bất kỳ thứ gì khác ngoài $post
việc không cung cấp đầu ra đúng the_title()
chẳng hạn. wp_reset_postdata()
về lý thuyết nên quan tâm đến việc đặt lại $ post.
setup_postdata()
chính nó tham chiếu $post
như là một toàn cầu. Thay vì sử dụng, get_posts()
bạn nên xác định một trường hợp tùy chỉnhWP_Query
và sử dụng nó để có được bài viết của bạn. Nó sẽ thiết lập dữ liệu bài đăng cho bạn cũng như làm cho the_title()
et al hoạt động theo cách họ được cho là ti.
Câu trả lời này đảm bảo rằng các bài đăng liên quan được sắp xếp theo số lượng thẻ phù hợp.
Ví dụ: nếu một bài viết có 3 thẻ và có một bài viết khác có cùng 3 thẻ thì nó sẽ xuất hiện ở đầu danh sách. Sắp xếp thứ cấp nên theo ngày đăng để nội dung mới hơn được ưa chuộng.
/**
* 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;
}
Truy vấn bên trong ở đây là chọn nội dung có các thẻ phù hợp nhất và sau đó truy vấn bên ngoài chỉ được sử dụng để áp dụng sắp xếp thứ cấp theo ngày đăng.
Lưu ý truy vấn này được viết cho SQL Server, vì vậy một số cú pháp có thể cần cập nhật (ví dụ: TOP so với LIMIT).
Đây là một tùy chọn sạch và rất linh hoạt:
Đặt mã này vào tệp tin.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;
}
Bây giờ bạn có thể chỉ cần gọi chức năng bất cứ nơi nào trong trang web của bạn bằng cách sử dụng:
<?php example_cats_related_post() ?>
Bạn có thể muốn xóa các thành phần danh sách hoặc định kiểu chúng theo nhu cầu của bạn.
* Chỉnh sửa - bạn thay đổi điều này: post_not_in thành post__not_in trong truy vấn của bạn
bạn có thể sử dụng mã này để nhận các bài đăng liên quan từ cùng một danh mục
$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; ?>
và sử dụng mã này để nhận các bài đăng liên quan từ cùng một thẻ
$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; ?>
$post
để thực hiện truy vấn của mình, sau đó xác định lại$post
trong cùng một bối cảnh trongforeach
vòng lặp của bạn .