Как в Wordpress скрыть определенные типы постов в пагинации для страницы single и page, но оставить их видимыми в лентах?

Как можно удалить упоминания о постах различных форматов, таких как single и page, с сохранением всех постов в лентах на сайте? Основной интерес состоит в удалении ссылок на post-formats из пагинации. (Учтено, что проблема с удалением ссылок на посты в лентах уже решена). Благодарю.
  • 5 января 2024 г. 18:09
Ответы на вопрос 2
Чтобы скрыть определенные типы постов в пагинации на страницах single и page в WordPress, но оставить их в лентах (архивах, главной странице и т.д.), можно использовать фильтр `pre_get_posts`. Этот фильтр позволяет изменить основные запросы WP_Query до того, как они будут выполнены. Однако в контексте single и page страниц, это не так просто, так как пагинация зависит от соседних постов (previous и next).

Для начала создадим функцию в файле `functions.php` вашей темы, которая будет проверять, является ли страница single или page, и исключать определенные типы постов из пагинации:

```php
function exclude_posts_from_pagination($query) {
    if (!is_admin() && $query->is_main_query()) {
        if (is_single() || is_page()) {
            // Исключаем определенные типы постов из пагинации
            // Замените 'custom_post_type' на ваш кастомный тип поста
            $query->set('post_type', array('post')); // Здесь перечисляются типы постов, которые вы хотите включить
        }
    }
}
add_action('pre_get_posts', 'exclude_posts_from_pagination');
```

**Обратите внимание, что данная функция может не сработать для пагинации single.php, так как этот шаблон обычно не использует WP_Query для вывода следующего/предыдущего поста.**

Для изменения логики пагинации на single.php (предыдущий и следующий пост), вам нужно будет настроить функции `previous_post_link()` и `next_post_link()` соответственно. В этих функциях вы можете определить `in_same_term` и указать таксономию, чтобы ограничить их использование.

Другой вариант - это использование хука `get_previous_post_where` и `get_next_post_where` для фильтрации и исключения определенных типов постов из пагинации. Вот пример того, как это можно сделать:

```php
function filter_next_previous_post_where($where) {
    global $post;
    // Исключить определенные типы постов
    $where .= " AND p.post_type = 'post'";
    return $where;
}
add_filter('get_previous_post_where', 'filter_next_previous_post_where');
add_filter('get_next_post_where', 'filter_next_previous_post_where');
```

Этот код добавит дополнительное условие в SQL-запрос для выбора предыдущего и следующего поста по типу поста `post`. Типы постов, которые вы хотите исключить, необходимо убрать из условия.

Эти изменения позволят вам изменить логику предыдущей и следующей ссылок на странице отдельных записей и статических страниц, исключив необходимые вам типы постов.
Для того чтобы скрыть упоминания постов определенных форматов в пагинации для страницы single и page в WordPress, вы можете использовать следующий код в файле functions.php вашей темы: 


В этом коде мы используем хук `pre_get_posts` для изменения запроса постов на страницах single и page. Мы определяем массив `$exclude_formats`, содержащий форматы постов, которые нужно исключить из пагинации. Затем мы создаем `tax_query`, которая исключает посты с указанными форматами, и устанавливаем этот `tax_query` в запросе.

После добавления этого кода, посты с определенными форматами, указанными в массиве `$exclude_formats`, не будут учитываться в пагинации для страницы single и page в WordPress.
PS Спонсор ответа ChatGPT
Похожие вопросы