WordPress WP_Query получить следующий пост с той же категорией

#php #wordpress #categories

#php #wordpress #Категории

Вопрос:

Я пытаюсь получить следующее сообщение с той же категорией, что и текущее сообщение в 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()

Может быть, мы можем изменить 'post__not_in' , чтобы включить текущие и все предыдущие сообщения?

Редактировать:

get_next_post_link не имеет фильтра категорий, поэтому, я думаю, здесь это не сработает.

Или мы можем использовать offset , чтобы начать после текущего сообщения. Не уверен, как вычислить индекс текущего сообщения в цикле.

Ответ №1:

Вот как я справился с этим, используя wp_query offset

  1. Запустите цикл в первый раз, чтобы проверить индекс текущего сообщения в цикле
  2. Установите смещение для второго цикла на индекс текущей страницы ( 1)
  3. Запустите второй цикл со смещением от первого цикла.

Таким образом, второй цикл игнорирует все сообщения, которые были до текущего сообщения, и отображает первое сообщение, которое идет после текущего.

Код:

 // 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;
  

Ответ №2:

Вы можете использовать функцию url_to_postid() для извлечения идентификатора из ссылки, а затем извлечения сообщения:

 $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. Хороший метод, я получил аналогичный результат 'post__not_in' => range(0,$post->ID)) . К сожалению, был показан неправильный пост (текущий). Может быть, проблема в моем интуитивно понятном пользовательском плагине для заказа типов сообщений?

2. Плагин был частью проблемы. Но все же … это не работает. Прежде всего, это должно быть get_next_post_link() вместо next_post_link() . Но это тоже не сработает, потому что: мы получаем идентификатор следующего сообщения. Но если в этом следующем сообщении нет класса $maincut_slug , запрос не даст никаких результатов. верно?

3. Итак, запрос должен выполняться только против p = postID

4. Да, но get_next_posts_link нет фильтра категории (не уверен, почему!). Таким образом, вы получите ссылку на следующее сообщение независимо от его категории. next-post-link имеет фильтр категорий… но это не помогает. В любом случае спасибо за вашу помощь!