Почему ‘exclude_from_search’ исключает пользовательский тип записи из WP_Query?

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

В WP 3.1, похоже, что установка 'exclude_from_search' = TRUE для пользовательского типа записи исключает этот тип не только из поиска на фронтенде, но и из любого запроса записей, использующего 'post_type' = 'all'.

Я могу представить множество сценариев, когда разработчик плагина хотел бы иметь доступ ко ВСЕМ типам записей, даже тем, которые исключены из поиска на фронтенде. Это ошибка или просто плохо задокументировано?

Предыстория:
У меня есть пользовательский тип записи, использующий пользовательское поле “Дата истечения публикации”. В попытке автоматически снять публикацию со сроком действия, я создал плагин Content Expiration, который использует wp_schedule_event() для периодического снятия публикации с записей, где “Дата истечения публикации” < Сегодня. Это работало отлично, пока я указывал свой пользовательский тип записи, но перестало работать, когда я попытался сделать его более общим, установив 'post_type' = 'all' в аргументах WP_Query. Оказалось, что проблема заключалась в аргументе ‘exclude_from_search’ для пользовательского типа записи. Вот соответствующий код в классе WP_Query:

$exclude_post_types="";
$in_search_post_types = get_post_types( array('exclude_from_search' => false) );
if ( ! empty( $in_search_post_types ) )
  $exclude_post_types .= $wpdb->prepare(" AND $wpdb->posts.post_type IN ('" . join("', '", $in_search_post_types ) . "')");

if ( 'any' == $post_type ) {
  $where .= $exclude_post_types;
}

Это сложно ответить – вы просите нас заглянуть в умы разработчиков WP, которые написали этот код 🙂

Возможно, они считали, что единственное место, где вам нужно запрашивать записи всех типов, это когда вы выполняете поиск, и поэтому они назвали это таким образом.

Возможно, это можно было бы задокументировать более ясно в Кодексе. Кодекс – это вики, так что не стесняйтесь добавить это сами!

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

Вопрос, касающийся аргумента exclude_from_search в контексте пользовательских типов записей WordPress (WP), действительно требует детального разбора. Давайте рассмотрим, почему установка exclude_from_search в значение TRUE приводит к исключению пользовательского типа записи не только из поисковых запросов на фронтэнде, но и из любых запросов, использующих post_type = ‘all’.

  1. Предпосылки и контекст:

    • В версии WP 3.1 была введена возможность определять, должен ли пользовательский тип записи исключаться из поиска. Это сделано для того, чтобы разработчики могли контролировать, какие типы записей будут доступны пользователям на сайте.
  2. Код WP_Query:

    • Из кода, который вы привели, видно, что при проверке типа записи, если post_type установлен в ‘any’, происходит дополнительная фильтрация типов записей:
      if ( 'any' == $post_type ) {
      $where .= $exclude_post_types;
      }

      Здесь подразумевается, что exclude_post_types собирает все типы записей, имеющие exclude_from_search как TRUE.

  3. Обоснование поведения:

    • Основная причина, по которой exclude_from_search исключает посты из всех запросов, а не только из поисковых, кажется, заключается в предположении разработчиков, что запросы на получение всех типов записей (то есть когда используется ‘any’) чаще всего относятся к поисковым запросам. Это ограничение может быть обусловлено желанием защитить пользователей от видимости контента, который по определению не предназначен для поиска.
  4. Документация и осведомлённость:

    • Данная функциональность не была должным образом задокументирована, что может вызывать путаницу у разработчиков. Важно добавить соответствующее примечание в официальную документацию, чтобы сообщить о таком поведении и возможных последствиях его использования.

Практическое применение

В вашем случае с плагином, который управляет истечением срока действия постов, ситуация становится ограничивающей. Чтобы обойти это ограничение, существует несколько альтернативных подходов:

  • Запрос по конкретному типу записи: Вместо использования ‘post_type’ = ‘all’, укажите конкретный тип записи в запросе, чтобы избежать конфликтов с параметром exclude_from_search.

  • Использование фильтров: Можно создать фильтр или изменение поведения WP для устранения этого ограничения, хотя это потребует углубленных знаний о внутреннем устройстве WP.

Заключение

Таким образом, установка exclude_from_search как TRUE действительно влияет на поведение WP_Query, исключая пользовательские типы из всех запросов, включая запрашиваемые ‘any’. Это не является явным "багом", а скорее выбором архитектуры, который потенциально нуждается в лучшей документации. Разработчики, создающие плагины или темы на основе WP, должны учитывать это поведение, чтобы избежать неожиданных результатов.

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

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