Ссылки на следующий и предыдущий пост ТОЛЬКО внутри категории
Я использую функцию 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
dmtnexer
Тебе не стоит создавать новый вопрос, так как это, по сути, продолжение текущего. Если код, который я предоставил, не подходит, мы можем обсудить это здесь, в комментариях. И если потребуется, ты можешь отредактировать свой вопрос, добавив обновленную информацию.
David Gard
Обновил вопрос... Спасибо за разъяснение, как правильно этим пользоваться.
dmtnexer
запись, которая отображается функцией, не принадлежит той же категории, что и просматриваемая запись... я использую тему twentyten... я совсем запутался. есть ли способ на PHP проверить, является ли это последней записью в категории, чтобы вывести CSS, скрывающий ссылку "далее"... и то же самое с ссылкой "назад"... звучит как костыль... есть идеи? спасибо за помощь, я многому учусь.
dmtnexer
@dmtnexer - Посмотрите другое обновление, которое я опубликовал, и дайте знать, если это поможет. Поведение по умолчанию заключается в том, что ссылка не отображается, если не на что ссылаться, поэтому тот факт, что она появляется, говорит о том, что должна быть какая-то связь между этими категориями. В идеальном мире параметр $in_same_term позволял бы передавать ID/ярлык термина, чтобы ссылаться только на него, и избавил бы нас от необходимости использовать фильтры, но, к сожалению, он этого не делает.
David Gard
Дорогой Дэвид, ЭТО РАБОТАЕТ!!!!! спасибо! Мне нужно разобраться с этими фильтрами.. есть ли у вас какие-то рекомендации, где я могу найти подробности об этом виде фильтров?
dmtnexer
@dmtnexer - Посмотрите страницу Filter Reference. Там перечислены большинство доступных фильтров, и если заголовок выделен синим, значит, есть дополнительная информация о нём (красный означает, что информации нет). Также советую ознакомиться с Action Reference page и убедиться, что вы понимаете разницу между ними. Если вы не уверены, доступен ли тот или иной action/filter, загляните в исходные файлы и изучите код — только будьте осторожны и не изменяйте ядро :)
David Gard
@dmtnexer - О, и если мой ответ вам помог, пожалуйста, отметьте его как принятый.
David Gard
Я бы с радостью, но моя репутация меньше 15. Спасибо за предложения, обязательно их рассмотрю!!
dmtnexer
@dmtnexer - Это про голосование. Было бы довольно бессмысленно иметь сайт вопросов и ответов, на котором никто никогда не мог бы принимать ответы...
David Gard
интерфейс можно было бы улучшить - я не смог найти значок подтверждения, пока не погуглил :) спасибо
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;
}
Дайте мне знать результаты :)