Как выполнить поиск WP_Query с пользовательскими типами записей?

13 февр. 2014 г., 19:19:07
Просмотры: 32K
Голосов: 9

Я зарегистрировал пользовательский тип записи под названием "node".

Когда я создаю базовый WP_Query для получения записей этого типа, он работает нормально. Пример:

$args = array(  
'post_status' => 'publish',
'post_type' => 'node');

$query = new WP_Query($args);       

Это получит все опубликованные записи типа "node".

Однако, как только я комбинирую это с поиском, ничего не возвращается. Пример:

$args = array(  
'post_status' => 'publish',
'post_type' => 'node',
's' => 'My search term');

$query = new WP_Query($args);

Это не вернет ничего, хотя должно получить несколько записей типа 'node', которые содержат 'My search term'.

Насколько я могу видеть, типы записей автоматически устанавливаются на "post" и "page", как только я включаю параметр "s" в $args. Если я выведу var_dump от $query, он показывает следующее:

Без "s":

object(WP_Query)
  public 'query' => 
    array (size=2)
      'post_status' => string 'publish' (length=7)
      'post_type' => string 'node' (length=4)
  public 'query_vars' => 
    array (size=63)
      'post_status' => string 'publish' (length=7)
      'post_type' => string 'node' (length=4)
...

С "s":

object(WP_Query)
  public 'query' => 
    array (size=2)
      'post_status' => string 'publish' (length=7)
      's' => string 'My search term' (length=14)
      'post_type' => string 'node' (length=4)
  public 'query_vars' => 
    array (size=66)
      'post_status' => string 'publish' (length=7)
      's' => string 'My search term' (length=14)
      'post_type' => 
        array (size=2)
          0 => string 'post' (length=4)
          1 => string 'page' (length=4)
...

Таким образом, WordPress, похоже, переопределяет типы записей, как только появляется поиск.

Как это можно исправить?

4
Комментарии

Я не могу это подтвердить. Я только что протестировал нечто очень похожее — успешно. Вы пробовали отключить все плагины и/или использовать стандартную тему? Даже обычный поиск (то есть основной поиск, использующий форму поиска) включает все пользовательские типы записей, которые не исключены из поиска явным образом.

tfrommen tfrommen
13 февр. 2014 г. 20:57:56

Сегодня утром я написал поиск, который использовал post_type (пользовательский тип записи), post_status (publish) и s, и он работает отлично. Почти наверняка у вас есть фильтр или что-то подобное в плагине/теме, как предположил @tf.

Andrew Bartel Andrew Bartel
13 февр. 2014 г. 23:36:40

Я не смог это протестировать, но я уверен на 95%, что делал что-то подобное, и это работало. Я согласен с предположением о вмешательстве фильтров или действий.

s_ha_dum s_ha_dum
14 февр. 2014 г. 00:02:32

Вы правы, я попробовал это в чистой установке WordPress, и это работает. Похоже, что один из плагинов, которые я использую в своей среде, подключается к одному из событий pre-query. Спасибо!

Sebastian Sebastian
17 февр. 2014 г. 16:57:03
Все ответы на вопрос 4
1

Вы правы, я попробовал это в чистой установке WordPress, и это работает.

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

Спасибо!

17 февр. 2014 г. 17:13:47
Комментарии

Вы знаете, какой плагин вызвал эту проблему?

stefano1 stefano1
9 окт. 2014 г. 19:21:23
0

В стандартной установке WordPress, WP_Query по умолчанию использует post_type = 'post'.

Рассмотрим простой пример:

$args = array(
  "posts_per_page"=>5,
  "ignore_sticky_posts"=>true
);

$itposts = new WP_Query( $args );

Это приведёт к выполнению следующего запроса:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 5

ЛУЧШЕЕ РЕШЕНИЕ

Решение заключается в добавлении аргумента post_type со значением 'any'. Таким образом WordPress автоматически будет искать среди всех типов записей, за исключением ревизий и типов с установленным параметром exclude_from_search в true. Проблема в том, что по умолчанию вложения (attachments) не исключаются из поиска. Пока у вас не установлен аргумент post_status в 'inherit', это не должно мешать, так как вложения всегда имеют post_status равный 'inherit'.

В таком случае запрос изменится на:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 5

При необходимости можно исключить вложения из поиска с помощью этого кода:

add_action('init', 'exclude_attachments_from_search');

function exclude_attachments_from_search() {
  global $wp_post_types;

  $wp_post_types['attachment']->exclude_from_search = true;
}
29 апр. 2015 г. 08:57:24
0

Я только что столкнулся с этим, и такое решение сработало для меня:

вместо 'post_type' => 'node' попробуйте 'post_type' => ['node']

18 янв. 2023 г. 21:44:23
0
-2

Я знаю, что это очень старый вопрос, но я наткнулся на него, потому что у меня была такая же проблема. Я не могу оставить комментарий из-за репутации, но хочу помочь людям, таким как @Stefano, чтобы вам не пришлось перебирать все плагины и проверять, какой из них влияет на запрос.

В моем случае это был плагин под названием "Custom Search by BestWebSoft". Но это была не ошибка плагина — я просто не отметил галочкой свой пользовательский тип записи в его настройках.

5 сент. 2018 г. 12:04:08