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

Я зарегистрировал пользовательский тип сообщения, называемый «узел».

Когда я создаю базовый 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);

Это ничего не даст, хотя он должен получить несколько сообщений типа «узел», которые содержат «Мой поисковый запрос».

Насколько я вижу, типы сообщений автоматически устанавливаются на «пост» и «страницу», как только я включаю параметр «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, кажется, переопределяет типы сообщений, как только будет задействован поиск.

Как я могу это исправить?

7 голосов | спросил Sebastian 13 FebruaryEurope/MoscowbThu, 13 Feb 2014 21:19:07 +0400000000pmThu, 13 Feb 2014 21:19:07 +040014 2014, 21:19:07

3 ответа


4

Вы правы, я попробовал его в чистой Wordpress, и он работает.

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

Спасибо!

ответил Sebastian 17 FebruaryEurope/MoscowbMon, 17 Feb 2014 19:13:47 +0400000000pmMon, 17 Feb 2014 19:13:47 +040014 2014, 19:13:47
1

При установке пакета 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. Проблема, по умолчанию, вложения не исключаются из поиска. До тех пор, пока у вас нет аргумента 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;
}
ответил Tristan CHARBONNIER 29 AMpWed, 29 Apr 2015 08:57:24 +030057Wednesday 2015, 08:57:24
-1

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

Для меня это был плагин под названием « Пользовательский поиск по BestWebSoft ». Но это не было ошибкой плагинов, я просто не отмечил поле для своего настраиваемого типа сообщений в его настройках.

ответил NoLoHo 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 05 Sep 2018 12:04:08 +0300 2018, 12:04:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132