Ссылки на следующий и предыдущий пост ТОЛЬКО внутри категории
Я использую функцию next post link в WordPress для отображения навигационных ссылок "следующий пост в той же категории", и все работает хорошо... проблема в том, что когда я нахожусь на "последнем" посте категории, ссылка "СЛЕДУЮЩИЙ" все равно появляется и делает то, чего я не хочу: ссылается на первый пост другой категории. То же самое с первым постом категории - при просмотре первого поста категории появляется ссылка "ПРЕДЫДУЩИЙ", ведущая к предыдущему посту другой категории... Я бы хотел, чтобы в первом и последнем постах эти ссылки не отображались.
<div id="nav-above" class="navigation">
<div class="nav-previous"><?php previous_post_linknext_post_link( '%link', '<span class="meta-nav">' .
_x( '◄ Предыдущий', 'Ссылка на предыдущий пост','category' ,TRUE ) . '</span>' ); ?></div>
<div class="nav-next"><?php next_post_link( '%link', '<span class="meta-nav">' . _x( 'Следующий ► ', 'Ссылка на следующий пост', 'category',TRUE ) . '</span>' ); ?> </div>
</div><!-- #nav-above -->
http://codex.wordpress.org/Function_Reference/next_post_link

Вы можете сделать это, используя функции previous_post_link()
и next_post_link()
.
Эти функции автоматически создадут ссылки, и вам больше не понадобится логика для пагинации.
Если вы хотите ссылаться только на записи из той же категории, используйте функции со следующими параметрами:
previous_post_link('« %link', '%title', true);
next_post_link('%link »', '%title', true);
Обновление
В ответ на ваш обновлённый вопрос о проблеме с предыдущей/следующей ссылкой для первой/последней записи, обратите внимание на эту строку из Codex для функций previous_post_link()
и next_post_link()
относительно параметра $in_same_term
:
Определяет, должна ли следующая запись принадлежать к тому же таксономическому термину, что и текущая запись. Если установлено в 'true', будут отображаться только записи из текущего таксономического термина. Если запись находится как в родительской, так и в дочерней категории (или в нескольких терминах), ссылка на следующую запись будет вести к следующей записи в любом из этих терминов.
Учитывая это, возможно, ваши первые/последние записи связаны с несколькими категориями? Если это так, фильтр wp_get_object_terms
может помочь.
В вашем первоначальном вопросе (до редактирования) вы искали записи только в самой первой категории, поэтому применим эту логику здесь:
<?php add_filter('wp_get_object_terms', 'my_custom_post_navigation', 4, 99); ?>
<div id="nav-above" class="navigation">
<div class="nav-previous">
<?php previous_post_link( '<span class="meta-nav"> %link </span>', _x( '◄ Предыдущая', 'Ссылка на предыдущую запись', 'category') , TRUE ); ?>
</div>
<div class="nav-previous">
<?php next_post_link( '<span class="meta-nav"> %link </span>', _x( 'Следующая ►', 'Ссылка на следующую запись', 'category') , TRUE ); ?>
</div>
</div><!-- #nav-above -->
<?php remove_filter('wp_get_object_terms', 'my_custom_post_navigation', 99); ?>
Кроме того, поместите это в ваш файл functions.php:
/**
* Возвращает только первую категорию при выводе ссылок на предыдущую/следующую запись
*/
function my_custom_post_navigation($terms, $object_ids, $taxonomies, $args){
return array_slice($terms, 0, 1);
}

Привет, Дэвид, спасибо за ответ. Я задал новый вопрос, сформулированный лучше, и хотел бы услышать твои комментарии: http://wordpress.stackexchange.com/questions/178800/next-post-link-only-within-category

Тебе не стоит создавать новый вопрос, так как это, по сути, продолжение текущего. Если код, который я предоставил, не подходит, мы можем обсудить это здесь, в комментариях. И если потребуется, ты можешь отредактировать свой вопрос, добавив обновленную информацию.

Обновил вопрос... Спасибо за разъяснение, как правильно этим пользоваться.

запись, которая отображается функцией, не принадлежит той же категории, что и просматриваемая запись... я использую тему twentyten... я совсем запутался. есть ли способ на PHP проверить, является ли это последней записью в категории, чтобы вывести CSS, скрывающий ссылку "далее"... и то же самое с ссылкой "назад"... звучит как костыль... есть идеи? спасибо за помощь, я многому учусь.

@dmtnexer - Посмотрите другое обновление, которое я опубликовал, и дайте знать, если это поможет. Поведение по умолчанию заключается в том, что ссылка не отображается, если не на что ссылаться, поэтому тот факт, что она появляется, говорит о том, что должна быть какая-то связь между этими категориями. В идеальном мире параметр $in_same_term
позволял бы передавать ID/ярлык термина, чтобы ссылаться только на него, и избавил бы нас от необходимости использовать фильтры, но, к сожалению, он этого не делает.

Дорогой Дэвид, ЭТО РАБОТАЕТ!!!!! спасибо! Мне нужно разобраться с этими фильтрами.. есть ли у вас какие-то рекомендации, где я могу найти подробности об этом виде фильтров?

@dmtnexer - Посмотрите страницу Filter Reference. Там перечислены большинство доступных фильтров, и если заголовок выделен синим, значит, есть дополнительная информация о нём (красный означает, что информации нет). Также советую ознакомиться с Action Reference page и убедиться, что вы понимаете разницу между ними. Если вы не уверены, доступен ли тот или иной action/filter, загляните в исходные файлы и изучите код — только будьте осторожны и не изменяйте ядро :)

@dmtnexer - О, и если мой ответ вам помог, пожалуйста, отметьте его как принятый.

Я бы с радостью, но моя репутация меньше 15. Спасибо за предложения, обязательно их рассмотрю!!

@dmtnexer - Это про голосование. Было бы довольно бессмысленно иметь сайт вопросов и ответов, на котором никто никогда не мог бы принимать ответы...

интерфейс можно было бы улучшить - я не смог найти значок подтверждения, пока не погуглил :) спасибо

Если вам нужно ограничить ссылки на предыдущую или следующую запись для определенной произвольной таксономии, термина, пользовательского типа записи, произвольного поля или формата, то вам стоит попробовать плагин Ambrosite Next/Previous Post Link Plus. Этот плагин добавляет два новых тега шаблона — next_post_link_plus и previous_post_link_plus — которые являются усовершенствованными версиями стандартных тегов WordPress next_post_link и previous_post_link.
- Сортировка ссылок на следующую/предыдущую запись по другим колонкам, кроме post_date (например, по алфавиту).
- Сортировка ссылок по произвольным полям (поддерживается как строковая, так и числовая сортировка).
- Полная совместимость с WordPress 3.3, включая поддержку пользовательских типов записей, таксономий и форматов записей.
- Переход к первой записи, если следующей нет (и наоборот). Получение первой/последней записи вместо предыдущей/следующей (для навигационных ссылок Первая|Предыдущая|Следующая|Последняя).
- Отображение миниатюр записей рядом со ссылками (требуется WordPress 2.9 или выше).
- Обрезка заголовков ссылок до любой длины и отображение пользовательского текста во всплывающей подсказке.
- Отображение заголовка, даты, автора, категории и значения метаполей для ссылок на следующую/предыдущую запись.
- Указание пользовательского формата даты для переменной %date.
- Ограничение ссылок на следующую/предыдущую запись по той же категории, таксономии, формату, автору, значению произвольного поля, списку ID записей или списку категорий.
- Исключение категорий, произвольных таксономий, форматов записей или отдельных ID записей.
- Три метода исключения категорий для большего контроля над навигацией.
- Возврат нескольких ссылок на следующую/предыдущую запись (например, следующие N ссылок в HTML-списке).
- Возврат ID, заголовка, даты, атрибута href или объекта записи для ссылок вместо их вывода на экран.
- Возврат false, если ссылка не найдена, что позволяет темам условно отображать альтернативный текст.
- Совместимость с Post Types Order и другими популярными плагинами для изменения порядка записей.

Скопируйте страницу single.php из вашей родительской темы и вставьте её в директорию вашей Дочерней темы. Откройте файл single.php из директории дочерней темы и добавьте следующий код в конце файла [перед get_footer(); ]
<?php
$post_id = $post->ID; // Получаем ID текущей записи
$cat = get_the_category();
$current_cat_id = $cat[0]->cat_ID; // Получаем ID текущей категории
$args = array('category'=>$current_cat_id,'orderby'=>'post_date','order'=> 'DESC');
$posts = get_posts($args);
// Получаем ID записей, извлечённых функцией get_posts
$ids = array();
foreach ($posts as $thepost) {
$ids[] = $thepost->ID;
}
// Получаем и выводим ссылки на предыдущую и следующую записи в той же категории
$index = array_search($post->ID, $ids);
$prev_post = $ids[$index+1];
$next_post = $ids[$index-1];
?>
<?php if (!empty($prev_post)){ ?> <a class="previous-post" rel="prev" href="<?php echo get_permalink($prev_post) ?>"> <span class="meta-icon"><i class="fa fa-angle-left fa-lg"></i></span> Предыдущая</a> <?php } ?>
<?php if (!empty($next_post)){ ?> <a class="next-post" rel="next" href="<?php echo get_permalink($next_post) ?>">Следующая <span class="meta-icon"><i class="fa fa-angle-right fa-lg"></i></span> </a> <?php } ?>
После добавления этого кода, вставьте следующий код в файл Style.css вашей дочерней темы для стилизации ссылок:
a.previous-post, a.next-post {
color: #fff;
background-color: #4498e7;
text-align: center;
height: 34px;
line-height: 34px;
font-size: 14px;
border: 1px solid;
padding: 0 20px;
margin-bottom: 30px;
text-transform: uppercase;
border-radius: 4px;
font-weight: bold;
}
a.previous-post:hover, a.next-post:hover {
color: #4498e7;
background-color: #fff;
}
a.previous-post {
float: left !important;
}
a.next-post {
float: right !important;
}
Дайте мне знать результаты :)
