Помогите люди добрые, сами мы не местные! хочется получить такой результат: посты (записи) надо, чтобы попадали в ссылки следующий предыдущий только из той категории к которой принадлежит просматриваемый пост, в свою очередь пост может принадлежать нескольким категориям, но нужно посты листать в той категории которая прописана в url (domain.ru/category-name/super-post/). Другими словами нужно получать следующий и предыдущий посты у которых в URL есть тоже category-name сейчас в шаблоне такой код Код (Text): ?> <?php $prevPost = get_previous_post(true); // false = all categories if ($prevPost) { $args = array( 'posts_per_page' => 10, 'include' => $prevPost->ID ); $prevPost = get_posts($args); foreach ($prevPost as $post) { setup_postdata($prevPost); ?> <div class="post-previous tranz p-border"> <a href="<?php the_permalink($prevPost->ID); ?>" title="<?php the_title(); ?>"><i class="fa fa-chevron-left" aria-hidden="true"></i> <?php the_title(); ?></a> </div> <?php wp_reset_postdata(); } //end foreach } // end if $nextPost = get_next_post(true); // false = all categories if ($nextPost) { $args = array( 'posts_per_page' => 10, 'include' => $nextPost->ID ); $nextPost = get_posts($args); foreach ($nextPost as $post) { setup_postdata($nextPost); ?> <div class="post-next tranz p-border"> <a href="<?php the_permalink($nextPost->ID); ?>" title="<?php the_title(); ?>"><?php the_title(); ?> <i class="fa fa-chevron-right" aria-hidden="true"></i></a> </div> <?php wp_reset_postdata(); } //end foreach } ?> </div>
Дисклеймер: мой ответ дискуссионный, а не окончательное решение. Я думаю, тут нужно использовать обычные функции WP для постраничной навигации: https://codex.wordpress.org/Next_and_Previous_Links Для получения предыдущей страницы: previous_post_link() и для следующей: next_post_link(). Или их собратьев. Проблема, в том, что вашего результата без бубна, похоже не добиться. Или я гуглил плохо . По крайней мере, я на нашел решения, которое на занимало несколько страниц. Так вот, указанным функциям нельзя просто сказать, дай предыдущую (или следующую) страницу вот такого term, хотя при этом можно указать taxonomy. Но там есть параметр excluded_terms, который нам поможет. Я напишу алгоритм и код сразу. Вот что я придумал: Получаем текущую категорию по URL: PHP: $slugs = explode('/', get_query_var('category_name')); $current_category = get_category_by_slug('/'.end($slugs)); Получаем все termы нужной таксономии: PHP: $terms = get_terms( array( 'taxonomy' => 'category', ) ); Зная уже так много, мы готовим termы для исключения: PHP: $excluded_terms = []; foreach ( $terms as $term ) { if ( $term->term_id != $current_category->term_id ) { array_push( $excluded_terms, $term->term_id ); } } И финал, добавляем наши навигационные ссылки: PHP: previous_post_link( '« %link', '%title', true, $excluded_terms ); next_post_link( '%link »', '%title', true, $excluded_terms ); Я попробовал на кошках, у меня все работает как нужно.
готово! Код (Text): <div id="post-nav" class="p-border"> <?php $link = get_the_permalink(); $slugs = parseCatPostURL($link);// тут просто выдираю название категории! простейший метод на explode() $current_category = get_category_by_slug($slugs); $g=get_the_ID(); $t=$current_category->term_id; $posts = $wpdb->get_results("SELECT `ID`,`post_date`,`slug`, `post_title`,`post_date`, `post_content` FROM `wp_terms` AS `t1` INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id INNER JOIN `wp_term_relationships`AS t3 ON t2.term_taxonomy_id=t3.term_taxonomy_id INNER JOIN `wp_posts` AS t4 ON t4.ID=t3.object_id INNER JOIN `wp_postmeta` AS t7 ON t4.ID=t7.post_id WHERE t2.taxonomy='category' AND t1.term_id={$t} AND t4.post_status='publish' AND t4.ID<{$g} and meta_value in (SELECT meta_value FROM `wp_postmeta` WHERE `post_id`={$g} and `meta_key`=\"_category_permalink\") ORDER BY t4.post_date DESC LIMIT 1"); if (count($posts) > 0) { ?> <div class="post-previous tranz p-border"> <a href="<?php echo the_permalink($posts[0]->ID); ?> " title="<?php echo $posts[0]->post_title ?>"> <i class="fa fa-chevron-left" aria-hidden="true"></i> <?php echo $posts[0]->post_title ?></a> </div> <?php }else{ ?> <div class="post-previous tranz p-border">  </div> <?php } $posts = $wpdb->get_results("SELECT `ID`,`post_date`,`slug`, `post_title`,`post_date`, `post_content` FROM `wp_terms` AS `t1` INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id INNER JOIN `wp_term_relationships`AS t3 ON t2.term_taxonomy_id=t3.term_taxonomy_id INNER JOIN `wp_posts` AS t4 ON t4.ID=t3.object_id INNER JOIN `wp_postmeta` AS t7 ON t4.ID=t7.post_id WHERE t2.taxonomy='category' AND t1.term_id={$t} AND t4.post_status='publish' AND t4.ID>{$g} and meta_value in (SELECT meta_value FROM `wp_postmeta` WHERE `post_id`={$g} and `meta_key`=\"_category_permalink\") ORDER BY t4.post_date ASC LIMIT 1"); if (count($posts) > 0) { ?> <div class="post-next tranz p-border"> <a href="<?php echo the_permalink($posts[0]->ID); ?> " title="<?php echo $posts[0]->post_title ?>"> <?php echo $posts[0]->post_title ?> <i class="fa fa-chevron-right" aria-hidden="true"></i> </a> </div> <?php }else{ ?> <div class="post-next tranz p-border">  </div> <?php } ?> </div>