Wordpress WP_Query获得相同类别的下一篇文章

时间:2016-10-17 21:09:40

标签: php wordpress categories

我正在努力获得与WP当前帖子相同类别的下一篇文章。我不是想要获得下一篇文章(next_post_link())的链接,而是帖子本身。

目前我只收到同一类别的最新帖子,而不是帖子本身。

$query = new WP_Query( array( 'category_name' => $maincat_slug, 'posts_per_page' => 1, 'post__not_in' => array( $post->ID )) );
if ( $query->have_posts() ) : 
    while ( $query->have_posts() ) : $query->the_post(); 
        get_template_part( 'template-parts/content', 'teaser' ); 
    endwhile;
endif;

$maincat_slug包含当前帖子(get_the_category())的(第一个)类别slug。

也许我们可以更改'post__not_in'以包含当前和之前的所有帖子?

编辑:

get_next_post_link没有类别过滤器,因此我认为这不起作用。

或者我们可以使用offset在当前帖子之后开始。不知道如何计算循环中当前帖子的索引。

2 个答案:

答案 0 :(得分:0)

您可以使用函数url_to_postid()从链接中检索ID,然后获取帖子:

$link = next_post_link();
$postid = url_to_postid( $link );

$query = new WP_Query( array( 'category_name' => $maincat_slug, 'posts_per_page' => 1, 'p' => $postid );
if ( $query->have_posts() ) : 
    while ( $query->have_posts() ) : $query->the_post(); 
        get_template_part( 'template-parts/content', 'teaser' ); 
    endwhile;
endif;

答案 1 :(得分:0)

这就是我使用wp_query offset

取消它的方法
  1. 首次运行循环以检查循环中当前帖子的索引
  2. 将第二个循环的偏移量设置为当前页面的索引(+1)
  3. 使用第一个循环的偏移量运行第二个循环。
  4. 这样第二个循环会忽略当前帖子之前的所有帖子,并显示当前帖子之后的第一个帖子。

    代码:

    // Get current category (first cat if multiple are set)
    $category = get_the_category(); 
    $maincat_slug = $category[0]->slug;
    
    // Get current Post ID
    $current_id = $post->ID; 
    
    // Reset offset
    $offset = 0;
    
    // Calculate offset
    $query = new WP_Query( array( 'category_name' => $maincat_slug ) );
    if ( $query->have_posts() ) : 
        while ( $query->have_posts() ) : 
            $query->the_post(); 
            $test_id = $post->ID;
            if ( $test_id == $current_id ) :
                // Set offset to current post
                $offset = $query->current_post + 1;
            endif;
        endwhile; 
    endif;
    
    // Display next post in category
    $query = new WP_Query( array( 'category_name' => $maincat_slug, 'posts_per_page' => 1, 'offset' => $offset) );
    if ( $query->have_posts() ) : 
        while ( $query->have_posts() ) : 
            $query->the_post(); 
            get_template_part( 'template-parts/content', 'teaser' ); 
        endwhile; 
    else :
        // Fallback 
    endif;