Hiển thị bài đăng từ cùng thể loại bằng liên kết bài đăng tiếp theo / trước


7

Tôi đang sử dụng mã này, nhưng một khi tôi nhấp vào liên kết bài đăng / bài đăng trước, tôi được chuyển hướng đến bài đăng tiếp theo / bài viết trước của một danh mục khác.

 previous_post_link( '%link', 'Prev post in category', $in_same_term = true );
 next_post_link( '%link', 'Next post in category', $in_same_term = true );

Tôi đang cố gắng khắc phục vấn đề của tôi bằng cách sử dụng bài viết này .

Đây là mã tôi đang sử dụng cho các bài đăng và danh mục và tôi không sử dụng các loại và danh mục bài đăng tùy chỉnh:

$post_id = $post->ID;
$cat = get_the_category();
$current_cat_id = $cat[0]->cat_ID;
$args = array( 
    'category' => $current_cat_id, 
    'orderby'  => 'post_date', 
    'order'    => 'DESC' 
);
$posts = get_posts( $args );
foreach( $posts as $post ) {
    echo $post->post_content;
}
previous_post_link( '%link', 'Prev post in category', $in_same_term = true );
next_post_link( '%link', 'Next post in category', $in_same_term = true );

Về cơ bản, nó tìm nạp tất cả các bài đăng dựa trên danh mục và bây giờ tôi muốn liên kết bài đăng / bài đăng tiếp theo chỉ hoạt động cho danh mục cụ thể này.


Bạn có đang sử dụng mã trong single.php
Pieter Goosen

Đối với bài đăng nào bạn muốn hiển thị các liên kết bài trước / tiếp theo? Đối với bài đăng cuối cùng trong $postsmảng từ mã bạn cung cấp hoặc từ bài đăng chính trên trang hiện tại?
engelen

@pieter Goosen: vâng tôi đang sử dụng mã trong single.php
user54318

@engelen Tôi đang hiển thị tất cả các bài đăng liên quan đến danh mục trên trang hiện tại và bây giờ tôi muốn các liên kết tiếp theo và trước đó chỉ được giới hạn ở danh mục hiện tại
user54318

Được rồi, đây là loại trang gì? Một trang bài đăng, một kho lưu trữ danh mục, ..?
engelen

Câu trả lời:


18

Đây là mã để có được danh mục dựa trên các liên kết trước và tiếp theo trên bài viết:

<?php
$post_id = $post->ID; // current post ID
$cat = get_the_category(); 
$current_cat_id = $cat[0]->cat_ID; // current category ID 

$args = array( 
    'category' => $current_cat_id,
    'orderby'  => 'post_date',
    'order'    => 'DESC'
);
$posts = get_posts( $args );
// get IDs of posts retrieved from get_posts
$ids = array();
foreach ( $posts as $thepost ) {
    $ids[] = $thepost->ID;
}
// get and echo previous and next post in the same category
$thisindex = array_search( $post_id, $ids );
$previd    = isset( $ids[ $thisindex - 1 ] ) ? $ids[ $thisindex - 1 ] : 0;
$nextid    = isset( $ids[ $thisindex + 1 ] ) ? $ids[ $thisindex + 1 ] : 0;

if ( $previd ) {
    ?><a rel="prev" href="<?php echo get_permalink($previd) ?>">Previous</a><?php
}
if ( $nextid ) {
    ?><a rel="next" href="<?php echo get_permalink($nextid) ?>">Next</a><?php
}

+1 Đây chính xác là những gì tôi đang tìm kiếm. Yêu cầu của tôi là đặt hàng theo trường Đơn hàng trong hộp Chỉnh sửa thuộc tính trang. Vì vậy, tôi đã thay đổi $ args thành $args = array('category'=>$current_cat_id,'orderby'=>'menu_order','order'=> 'ASC');và điều đó đã giải quyết vấn đề của tôi. Cảm ơn rất nhiều vì đã chia sẻ giải pháp!
Devner

Cảm ơn rất hữu ích cho tôi
Sumit Kumar Gupta

3

Các previous_post_linknext_post_linkchức năng cả hai đều có năm thông số: $format: string Định dạng cho liên kết, được sử dụng để kiểm soát những gì đến trước và sau khi liên kết
$link: Liên kết văn bản để hiển thị
$in_same_term: Cho dù các bài tiếp theo / trước phải nằm trong hạn phân loại giống như bài hiện tại
$excluded_terms: Điều khoản từ đó để loại trừ các bài đăng $taxonomy: Phân loại để sử dụng khi nào $in_same_termlà đúng Như bạn có thể thấy, $in_same_termtham số thực hiện chính xác những gì bạn cần. Tuy nhiên, bạn không sử dụng đúng trong mã mẫu của mình. Bạn đang thực sự chuyển kết quả của việc gán truecho một biến $in_same_term. Điều này sẽ không hiệu quả: truyền một đối số cũng đơn giản như truyền một giá trị:

previous_post_link( '%link', 'Prev post in category', true );
next_post_link( '%link', 'Next post in category', true );

Chỉnh sửa: (được chỉnh sửa sau khi OP cập nhật câu hỏi của anh ấy) Vấn đề là ở chỗ previous_post_linknext_post_linksử dụng đối tượng bài đăng toàn cầu mà bạn đang ghi đè. Để ngăn chặn điều này, hãy sử dụng một tên biến khác trong $posts-loop của bạn , chẳng hạn như $singlepost:

foreach ( $posts as $singlepost ) {
    echo $singlepost->post_content
}

Bằng cách này, các $postđối tượng toàn cầu được bảo tồn. Ngoài ra, bạn có thể lưu trữ đối tượng bài đăng toàn cầu trong một biến tạm thời và đặt $postlại sau, nhưng điều đó chỉ thực sự cần thiết nếu bạn đang gọi setup_postdata(mà bạn không gọi).


Cảm ơn cho phản ứng nhanh chóng của bạn. Tôi vẫn nhận được kết quả tương tự.
dùng54318

Bạn sẽ phải cung cấp cho chúng tôi nhiều thông tin hơn thế :-). Bạn đang sử dụng một loại bài đăng tùy chỉnh hoặc phân loại tùy chỉnh, hoặc chỉ đơn giản là "Bài viết" và "Danh mục"? Có nơi nào mà chúng ta có thể thấy những gì thực sự sai?
engelen

tôi đã cập nhật câu hỏi của mình
user54318

Tôi đã cập nhật câu trả lời của mình cho phù hợp.
engelen

1

Mã của bạn không có ý nghĩa với tôi, ngoài việc có lỗi cú pháp. Khi mã của bạn đứng, khi bạn nhấp vào một bài đăng từ trang bài đăng / blog, bạn sẽ được đưa đến chế độ xem duy nhất của bài đăng. Chỉ có bài đăng đó được hiển thị trên single.php.

Vấn đề bắt đầu khi bạn nhấp vào liên kết bài đăng, không quan trọng nếu đó là liên kết bài trước hoặc bài tiếp theo. Những gì được trả về là tất cả các bài đăng trong danh mục cụ thể đó khi tải trang tiếp theo / trước đó. Đó là cách bạn mã hóa tệp.php của mình và tại sao các liên kết bài đăng của bạn không hoạt động như bạn mong đợi.

Tôi sẽ không sử dụng get_posts()để thiết lập vòng lặp của mình trên trang single.php. Tôi sẽ chỉ sử dụng các vòng lặp thích hợp bình thường. Vui lòng kiểm tra trang này trong bộ luật về Phát triển chủ đề

Dưới đây là một ví dụ về một tệp.php sẽ hoạt động như mong đợi

<?php
get_header(); ?>

<div id="main-content" class="main-content">

    <div id="primary" class="content-area">
        <div id="content" class="site-content" role="main">
            <?php
                // Start the Loop.
                while ( have_posts() ) : the_post(); ?>

            <?php
                    get_template_part( 'content', get_post_format() );

                    // Previous/next post navigation.
                    previous_post_link( '%link', 'Prev post in category', true );
                    next_post_link( '%link', 'Next post in category', true );

                    // If comments are open or we have at least one comment, load up the comment template.
                    if ( comments_open() || get_comments_number() ) {
                        comments_template();
                    }
                endwhile;
            ?>
        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar( 'content' ); ?>
</div><!-- #main-content -->

<?php
get_footer();

Như đã chỉ ra trong câu trả lời khác, hãy đi và đọc về cách sử dụng next_post_linkprevious_post_link


Cảm ơn phản hồi của bạn, bạn có thể cho tôi biết lỗi cú pháp trong mã của tôi không
user54318

Trong dòng này echo $post->post_content, đã quên;
Pieter Goosen

Ồ vâng, hiểu rồi :)
user54318

Vui lòng đặt gỡ lỗi thành true trong wp-config. Điều này sẽ giúp bạn rất nhiều
Pieter Goosen

Bạn nên thử những gì tôi đã nói, mã của bạn không thể hoạt động, với mã của bạn, vì nó là, nó sẽ chỉ tải lại cùng một trang với các liên kết bài đăng
Pieter Goosen

0

Tôi có cùng một vấn đề PLUS Tôi cần tất cả những điều đó cho loại bài đăng tùy chỉnh & phân loại tùy chỉnh. user54318 chỉ cho tôi đi đúng hướng, không có khả năng chạy cpt, vì vậy tôi cũng sẽ chia sẻ kết quả của mình ở đây:

//get custom taxonomies.
$terms = wp_get_post_terms( get_the_ID(), 'product_cat' ); //last argument is the custom taxonomy. change to desired tax
//run through all terms and filter out the one, that i need. 
$stay_in = array();
foreach( $terms as $term ) :
/*this loop looks for a category, that is a children of category id 37. change to your needs. 
only importance is to build an array of term ids, to be included in the previous/next behaviour, so if you already know your ids, you could also use something like $stay_in = array( 43 ); and skip this whole loop..*/
    if ( $term->parent == 37 ) :
        $stay_in[] = $term->term_id;
        break; //break out the foreach, if found.
    endif;
endforeach;
//get all post ids, that are in my defined category
$args = array(
    'post_type'         => 'product', //custom post type
    'posts_per_page'    => -1,
    'tax_query'         => array(
        array(
            'taxonomy'  => 'product_cat', // custom taxonomy
            'field'     => 'term_id',
            'terms'     => $stay_in,
            'operator'  => 'IN', //change to your needs.. IN, NOT IN, AND, EXISTS, NOT EXISTS
        )
    ),
    'orderby'           => 'post_date',
    'order'             => 'ASC',
    'fields'            => 'ids', //only return the post ids, not the whole post-objects
);
$all_posts = new WP_Query( $args );
//search for the current post by its id and look for the previous / next ids
$this_index = array_search( $post->ID, $all_posts->posts );
$prev_id = $all_posts->posts[ $this_index - 1 ];
$next_id = $all_posts->posts[ $this_index + 1 ];
//echo links, if prevoius/next exists
if ( ! empty( $prev_id ) ) :
    echo '<a rel="prev" href="' . get_permalink( $prev_id ) . '">' . __( 'previous', 'your_theme_text_domain' ) . '</a>';
endif;

if ( ! empty( $next_id ) ) :
    echo '<a rel="next" href="' . get_permalink( $next_id ) . '">' . __( 'next', 'your_theme_text_domain' ) . '</a>';
endif;
wp_reset_postdata();
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.