Как нацелиться на стандартные виджеты “Недавние записи” и “Недавние комментарии” с помощью pre_get_posts?

Вопрос или проблема

Я добавил следующее в мой functions.php:

add_action('pre_get_posts', 'keyl_get_emp_posts');
function keyl_get_emp_posts($query) {
    if ($query->is_main_query())
        $query->set('post_type', 'employee');
}

и пока это эффективно фильтрует результаты поиска. Однако, стандартные виджеты “Последние записи” и “Последние комментарии” всё ещё не изменены. В чём дело?

pre_get_posts выполняется перед каждым запросом. Ваш $query->is_main_query() заставляет этот код изменять запрос только для основного запроса. Таким образом, если вы находитесь на странице архива, вы меняете только архивные записи, но не затрагиваете другие запросы (виджеты, меню и т.д.).

Но будьте внимательны, этот код изменит запрос для ВСЕХ ваших основных запросов. Так что, если вы перейдете к архивам другого типа записей (категории и т.д.), вы будете изменять запрос на получение post_type = employee

Как виджет “Последние записи”, так и виджет “Последние комментарии” предоставляют фильтр, которым вы можете воспользоваться для изменения запроса, и оба они принимают один и тот же аргумент.

function alter_recent_widget_post_type_wpse_54931($args) {
  $args['post_type'] = 'employee';
  return $args;
}
add_filter('widget_posts_args','alter_recent_widget_post_type_wpse_54931');
add_filter('widget_posts_args','alter_recent_widget_post_type_wpse_54931');

Это изменит виджеты каждый раз, когда они выполняются, так что, если вам нужно, чтобы виджеты функционировали в разных контекстах, вам понадобится что-то более сложное.

Ответ или решение

Проблема, с которой вы столкнулись, состоит в том, что ваш текущий код в functions.php изменяет только основную (main) часть запроса, использую проверку $query->is_main_query(). Это означает, что изменения в запросе применяются только для основной части страниц архива, но никак не затрагивают побочные запросы, которые делают виджеты, такие как "Недавние записи" и "Недавние комментарии". Чтобы изменить эти виджеты, необходимо использовать другой подход, поскольку они делают свои собственные, отдельные запросы к базе данных.

Теория

Эти виджеты используют свои собственные параметры для запроса данных, и они имеют собственные фильтры для модификации этих параметров. Виджеты "Recent Posts" и "Recent Comments" в WordPress используют фильтр widget_posts_args, который позволяет задать параметры запроса перед его выполнением. Для изменения типа записей, получаемых этими виджетами, можно воспользоваться этим фильтром и специфически указать post_type.

Пример

Рассмотрим пример того, как можно изменить параметры запроса для работы с вашим пользовательским типом записей ’employee’:

function alter_recent_widget_post_type($args) {
    // Изменяем тип постов на 'employee'
    $args['post_type'] = 'employee';
    return $args;
}

// Применяем к фильтру widget_posts_args
add_filter('widget_posts_args', 'alter_recent_widget_post_type');

Этот код добавляет фильтр, который применяется при выполнении виджетов "Recent Posts" и "Recent Comments", устанавливая параметр post_type как ’employee’.

Применение

Когда этот фильтр применен, каждый раз, когда виджеты будут запрашивать записи для отображения, они получат записи типа ’employee’ вместо стандартных записей или комментариев. Если вам нужно, чтобы виджеты функционировали по-особенному в разных контекстах, будь то главная страница, архив, рубрики и так далее, вам нужно будет добавить логику в функцию alter_recent_widget_post_type, чтобы проверять условия и соответственно изменять параметры запроса.

Например, чтобы применять измененные параметры только для определенных страниц, вы можете использовать условные теги WordPress внутри функции:

function alter_recent_widget_post_type($args) {
    if (is_home() || is_front_page()) {
        $args['post_type'] = 'employee';
    }
    return $args;
}

Таким образом, изменение будет применяться только на главной странице или на главной статической странице (если она настроена). При другом подходе, вы можете использовать другие условия в зависимости от своих нужд, такие как проверка текущего пользователя, роли, категории и т.д.

Заключение

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

Таким образом, использование фильтров дает возможность точечно влиять на конкретные части функциональности, такие как виджеты, без необходимости радикально переделывать основные запросы на сайте. Это позволяет поддерживать оптимальную производительность и предсказуемость поведения, что, в свою очередь, очень важно при разработке сложных динамических сайтов на базе WordPress.

Оцените материал
Добавить комментарий

Капча загружается...