Вопрос или проблема
В 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’.
Анализ поведения exclude_from_search
-
Предпосылки и контекст:
- В версии WP 3.1 была введена возможность определять, должен ли пользовательский тип записи исключаться из поиска. Это сделано для того, чтобы разработчики могли контролировать, какие типы записей будут доступны пользователям на сайте.
-
Код WP_Query:
- Из кода, который вы привели, видно, что при проверке типа записи, если
post_type
установлен в ‘any’, происходит дополнительная фильтрация типов записей:if ( 'any' == $post_type ) { $where .= $exclude_post_types; }
Здесь подразумевается, что
exclude_post_types
собирает все типы записей, имеющиеexclude_from_search
какTRUE
.
- Из кода, который вы привели, видно, что при проверке типа записи, если
-
Обоснование поведения:
- Основная причина, по которой
exclude_from_search
исключает посты из всех запросов, а не только из поисковых, кажется, заключается в предположении разработчиков, что запросы на получение всех типов записей (то есть когда используется ‘any’) чаще всего относятся к поисковым запросам. Это ограничение может быть обусловлено желанием защитить пользователей от видимости контента, который по определению не предназначен для поиска.
- Основная причина, по которой
-
Документация и осведомлённость:
- Данная функциональность не была должным образом задокументирована, что может вызывать путаницу у разработчиков. Важно добавить соответствующее примечание в официальную документацию, чтобы сообщить о таком поведении и возможных последствиях его использования.
Практическое применение
В вашем случае с плагином, который управляет истечением срока действия постов, ситуация становится ограничивающей. Чтобы обойти это ограничение, существует несколько альтернативных подходов:
-
Запрос по конкретному типу записи: Вместо использования ‘post_type’ = ‘all’, укажите конкретный тип записи в запросе, чтобы избежать конфликтов с параметром
exclude_from_search
. -
Использование фильтров: Можно создать фильтр или изменение поведения WP для устранения этого ограничения, хотя это потребует углубленных знаний о внутреннем устройстве WP.
Заключение
Таким образом, установка exclude_from_search
как TRUE
действительно влияет на поведение WP_Query, исключая пользовательские типы из всех запросов, включая запрашиваемые ‘any’. Это не является явным "багом", а скорее выбором архитектуры, который потенциально нуждается в лучшей документации. Разработчики, создающие плагины или темы на основе WP, должны учитывать это поведение, чтобы избежать неожиданных результатов.