Показать сообщения из той же категории, используя следующую / предыдущую ссылку

Я использую этот код, но после того, как я нажму ссылку на следующий пост / предыдущий пост, я перенаправлен на следующий пост / предыдущий пост другой категории.

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

Я пытаюсь исправить свою проблему, используя эту статью .

Вот код, который я использую для сообщений и категорий, и я не использую персонализированные типы и категории сообщений:

 $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 ); 

Это в основном получение всех сообщений по категории, и теперь я хочу, чтобы следующая должность / предыдущая ссылка для работы работала только для этой конкретной категории.

Вот код для получения категорий на основе предыдущих и следующих ссылок на сообщения:

 <?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 } 

Функции previous_post_link и next_post_link имеют пять параметров: $format : строка форматирования для ссылки, используемая для управления тем, что происходит до и после ссылки
$link : Ссылка на текст для отображения
$in_same_term : должен ли следующий / предыдущий пост быть в том же таксономии, что и текущая должность
$excluded_terms : термины, из которых следует исключать $in_same_term $taxonomy : таксономия для использования, когда $in_same_term истинна. Как видите, параметр $in_same_term делает именно то, что вам нужно. Однако вы не используете его правильно в своем примере кода. Фактически вы передаете результат присваивания true переменной $in_same_term . Это не сработает: передать аргумент так же просто, как передать значение:

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

Edit: (отредактировано после того, как OP обновил свой вопрос). Проблема в том, что previous_post_link и next_post_link используют глобальный объект post, который вы переписываете. Чтобы предотвратить это, используйте другое имя переменной в ваших $posts -loop, например $singlepost :

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

Таким образом, глобальный объект $post сохраняется. Кроме того, вы можете сохранить глобальный объект post во временной переменной и снова перезапустить $post позже, но это действительно необходимо, если вы вызываете setup_postdata (которого вы не являетесь).

Ваш код не имеет для меня смысла, кроме синтаксической ошибки. Поскольку ваш код стоит, когда вы нажимаете на сообщение со страницы пост / блога, вы попадаете в единственное представление сообщения, как должно. Только этот пост отображается на single.php.

Проблема начинается, когда вы нажимаете ссылку на сообщение, неважно, является ли это предыдущей или следующей ссылкой для ссылки. Возвращается все сообщения в этой конкретной категории при загрузке следующей / предыдущей страницы. Вот как вы закодировали свой сингл.php и почему ваши сообщения не работают так, как вы ожидаете.

Я бы не использовал get_posts() для настройки моего цикла на странице single.php. Я бы просто использовал нормальный правильный цикл. Пожалуйста, ознакомьтесь с этой страницей в кодексе о разработке темы

Вот пример single.php, который будет работать как ожидалось

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

Как указано в другом ответе, зайдите и прочитайте о том, как использовать next_post_link и previous_post_link

У меня была такая же проблема, как и у PLUS. Мне нужно все это для пользовательского типа сообщений и пользовательской таксономии. user54318 указал мне в правильном направлении, которое не способно запускать cpt, поэтому я тоже поделюсь своими результатами:

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