Хук posts_fields в WPFTS
Хук posts_fields в WordPress — это фильтр, который позволяет модифицировать список полей, выбираемых из таблицы wp_posts в SQL-запросе. WPFTS использует этот хук для добавления поля relev (релевантность) в запрос и для оптимизации запроса в режиме разделенного запроса (split_the_query).
Что делает WPFTS при вызове posts_fields:
-
Сохранение исходного списка полей: WPFTS сохраняет оригинальное значение $fields, переданное в фильтр, в сессии $wpq->wpftsi_session[‘old_fields’]. Это необходимо для корректной работы с разделенным запросом.
-
Определение режима разделенного запроса: Плагин проверяет, нужно ли использовать разделенный запрос, на основании наличия LIMIT в запросе и количества запрашиваемых постов (posts_per_page). Если разделенный запрос необходим, WPFTS модифицирует список полей, выбираемых в первом запросе.
-
Добавление поля relev: В случае разделенного запроса, WPFTS выбирает только ID поста и его релевантность ({$wpdb->posts}.ID, wpfts_t.relev) в первом запросе. Это позволяет существенно ускорить запрос, так как не требуется выбирать все данные поста. Во втором запросе уже выбираются все необходимые данные для отображения результатов. Если разделенный запрос не используется, WPFTS просто добавляет поле relev к исходному списку полей.
Важные функции, задействованные в обработке posts_fields:
- WPFTS_Search::index_posts_fields()
Как это использовать в разработке аддонов:
Разработчики аддонов должны учитывать, что WPFTS может изменять список полей, выбираемых в запросе. Если ваш аддон также модифицирует этот список, убедитесь, что ваша логика совместима с WPFTS. В частности, если ваш аддон требует наличия определенных полей в запросе, убедитесь, что они присутствуют как в случае использования разделенного запроса, так и без него.
Дополнительные замечания:
-
WPFTS использует разделенный запрос для оптимизации производительности при большом количестве результатов поиска.
-
Поле relev добавляется в запрос только при включенном индексном поиске.