Làm thế nào để hiển thị các bài viết liên quan từ cùng một thể loại?


9

Có thể hiển thị các bài viết liên quan từ cùng thể loại với bài viết hiện tại?

Câu trả lời:


21

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();
}

Hãy rất cẩn thận với tên biến của bạn! Bạn đang sử dụng toàn cầu $postđể thực hiện truy vấn của mình, sau đó xác định lại $posttrong cùng một bối cảnh trong foreachvòng lặp của bạn .
EAMann

@EAMann - nói chung là bạn đúng - tuy nhiên theo kinh nghiệm của tôi, sử dụng setup_postdata()với bất kỳ thứ gì khác ngoài $postviệ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.
Michael

1
Đó là bởi vì setup_postdata()chính nó tham chiếu $postnhư 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.
EAMann

@EAMann Đây là một bài viết khá cũ, nhưng sẽ được đánh giá cao nếu bạn có thể viết câu trả lời về cách thực hiện chính xác với truy vấn tùy chỉnh và tất cả
GiantCowFilms

0

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).


0

Đâ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


Nó chỉ hiển thị một bài viết. Có thể hiển thị tất cả các bài viết của cùng một thể loại trên một trang thể loại?
Raul

0

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; ?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.