Вопрос или проблема
Я использую категорию для разделения всех постов этой одной категории, чтобы она выглядела как завершенный подпункт веб-сайта. Таким образом, основной поток постов использует плагин для скрытия постов этой категории, и я использую элемент меню в заголовке, чтобы связать с страницей, отображающей посты только этой категории.
Однако, как только вы нажимаете на пост, следующая и предыдущая будут просматривать все посты независимо от категорий, и я хотел бы, чтобы это оставалось в контексте этой категории.
Аналогично, в полном обычном потоке, как только пост открыт, я хотел бы, чтобы навигация исключала эту категорию.
Выберите любую из следующих функций:
get_next_post_link();
next_post_link();
get_previous_post_link();
previous_post_link();
Параметры следующие (в соответствующем порядке):
@param
string
$format
Необязательный. Формат анкора ссылки. По умолчанию ‘« %link’.@param
string
$link
Необязательный. Формат постоянной ссылки. По умолчанию ‘%title’.@param
bool
$in_same_term
Необязательный. Должна ли ссылка быть в том же таксономическом терме. По умолчаниюfalse
.@param
array|string
$excluded_terms
Необязательный.Массив
или список ID исключенных терминов, разделённых запятыми. По умолчаниюempty
.@param
string
$taxonomy
Необязательный. Таксономия, если$in_same_term
равноtrue
. По умолчанию ‘category’.
@return
string
URL ссылки на следующий пост в отношении текущего поста.
Дополнительно, вы можете сделать больше с вашей пагинацией, если выберете больше работы. Вы можете использовать get_next_post();
или get_previous_post();
Эти две функции позволят вам получить весь объект следующего/предыдущего поста. Затем вы сможете получить метаданные поста, изображение, формат поста, отрывок поста и т. д.
Параметры следующие (в соответствующем порядке):
@param
bool
$in_same_term
Необязательный. Должен ли пост находиться в том же таксономическом терме. По умолчаниюfalse
.@param
array|string
$excluded_terms
Необязательный.Массив
или список ID исключенных терминов, разделённых запятой. По умолчаниюempty
.@param
string
$taxonomy
Необязательный. Таксономия, если$in_same_term
равноtrue
. По умолчанию ‘category’.
@return
null|string|WP_Post
Объект поста
, если успешно.Null
, еслиglobal $post
не установлен.Пустая
строка
, если соответствующий пост не существует.
Все это (и больше) можно найти в ./wp-includes/link-template.php
Ответ или решение
Чтобы ограничить навигацию между постами только постами одной категории на вашем сайте WordPress, необходимо настроить функции для получения ссылок на следующий и предыдущий пост, используя параметры, которые позволяют фильтровать посты по категориям.
Шаги для реализации
1. Использовать функции get_next_post_link()
и get_previous_post_link()
Эти функции позволяют создавать ссылки на следующий и предыдущий пост с возможностью фильтрации по категориям. Ниже приведен пример кода, который можно вставить в файл вашей темы (обычно это single.php
или content-single.php
):
<?php
// Получаем текущий пост
$current_post = get_post();
// Получаем идентификаторы категорий текущего поста
$current_categories = wp_get_post_categories($current_post->ID);
// Убедимся, что текущий пост имеет хотя бы одну категорию
if (!empty($current_categories)) {
// Формируем ссылки на следующий и предыдущий посты в той же категории
echo '<div class="post-navigation">';
// Ссылка на предыдущий пост в той же категории
previous_post_link('%link', '« %title', true, '', 'category');
// Ссылка на следующий пост в той же категории
next_post_link('%link', '%title »', true, '', 'category');
echo '</div>';
}
?>
2. Исключение определенной категории при переходах с главного фида
Если вы также хотите исключить определенную категорию из навигации, когда пользователь открывает пост из полной ленты, вы можете добавить дополнительную проверку:
<?php
// Получаем боковую информацию о текущем посте и его категориях
$current_post = get_post();
$current_categories = wp_get_post_categories($current_post->ID);
// Условная проверка для исключения определенной категории
$excluded_category_id = 123; // Замените 123 на ID категории, которую вы хотите исключить
if (!in_array($excluded_category_id, $current_categories)) {
// Если категория не исключена, выводим навигацию
echo '<div class="post-navigation">';
previous_post_link('%link', '« %title', false, $excluded_category_id, 'category');
next_post_link('%link', '%title »', false, $excluded_category_id, 'category');
echo '</div>';
}
?>
3. Объяснение параметров
$in_same_term
— устанавливая этот параметр вtrue
, вы указываете, что посты должны находиться в одной и той же таксономной терминологии (в данном случае в одной категории).$excluded_terms
— этот параметр может быть использован для исключения постов определенной категории из навигации.
Заключение
Теперь пользователь при переходе к следующему или предыдущему посту будет перемещаться только по постам той же категории, что создаст более четкую и логичную навигацию. Описанные способы также позволяют гибко управлять интеракцией с контентом, исключая определенные категории, если это необходимо.
Вы можете адаптировать предложенный код в зависимости от вашей конкретной структуры темы или требований вашего проекта. Убедитесь, что все изменения тестируются в безопасной среде перед развертыванием на живом сайте.