#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)
- Запустите второй цикл со смещением от первого цикла.
Таким образом, второй цикл игнорирует все сообщения, которые были до текущего сообщения, и отображает первое сообщение, которое идет после текущего.
Код:
// 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
имеет фильтр категорий… но это не помогает. В любом случае спасибо за вашу помощь!