WP_query хуки перед выполнением поискового запроса

13 окт. 2015 г., 01:04:17
Просмотры: 14.2K
Голосов: 0

Кто-нибудь знает, существует ли хук перед выполнением поискового запроса (не в основном цикле), чтобы изменить параметр 's' и избежать разбиения фразы в WordPress? Примеры приветствуются... спасибо

P.S.: Я также пробовал следующим образом, но первая часть SQL-запроса указывает на то, что WP уже выполнил поиск и затем повторно запускает запрос, отфильтрованный по post_ids, найденным в первом запросе:

function alter_the_query( $where = '' ) {
global $wpdb, $table_prefix, $wp_query;
$tmpQobj = $wp_query->queried_object;
$tmpTitle = $wp_query->queried_object->post_title;

$where .= $wpdb->prepare( " AND ({$table_prefix}posts.post_title like %s OR {$table_prefix}posts.post_content like %s )", "%{$tmpTitle}%", "%{$tmpTitle}%" );

debug($where);

return $where;
}
add_filter( 'posts_where', 'alter_the_query' );

И вот содержимое значения request (* заменяет префикс таблицы), возвращаемое debug:

[request] => SELECT SQL_CALC_FOUND_ROWS  ***_posts.ID FROM ***__posts  WHERE 1=1  AND ***__posts.ID IN (534,868,911,917) AND ***__posts.post_type IN ('multimedia', 'news', 'social_project', 'publication') AND ((***__posts.post_status = 'publish')) AND (***__posts.post_title like '%string to search%' OR ***__posts.post_content like '%string to searchs%' )  ORDER BY FIELD( ***__posts.ID, 534,868,911,917 ) LIMIT 0, 3

Как видите, оригинальный поиск уже выполнен, и мои изменения влияют только на второй запрос... Я не знаю, почему разработчики WordPress Core сделали это таким образом, но это настоящий кошмар...

Как я могу подключиться к первому запросу, тому, который связан с оригинальным поиском?

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

Что именно вам нужно сделать

Pieter Goosen Pieter Goosen
13 окт. 2015 г. 08:39:37

Мне нужно обойти разделение фраз в WordPress, чтобы выполнить точный поиск по заголовку и содержанию. Я пробовал параметры 'exact' и 'sentence' в аргументах запроса, но это не мой случай. Также пробовал некоторые фильтры, но они изменяют параметры, но не обходят разделение. Мне нужно внести изменение в SQL-запрос непосредственно перед реальным выполнением

Nicola Boccardi Nicola Boccardi
13 окт. 2015 г. 11:49:08
Все ответы на вопрос 2
0

Чтобы избежать разделения поисковых фраз, используйте переменную запроса sentence в хуке pre_get_posts:

function only_search_for_full_phrase( $query ) {
    if ( $query->is_search() && $query->is_main_query() ) {
        $query->set( 'sentence', true );
    }
}
add_action( 'pre_get_posts', 'only_search_for_full_phrase' );

Не тестировал, но должно сработать.

Удачного кодинга!

27 апр. 2018 г. 09:44:01
1

Вы ищете хук pre_get_posts.

13 окт. 2015 г. 03:54:02
Комментарии

Я уже пробовал этот способ, но похоже, что я могу изменять только параметры, а не сам SQL-запрос. Таким образом, фраза в параметре 's', с которой я хотел бы делать точное совпадение, снова будет разбита... Это довольно сложный случай... Единственной альтернативой кажется выполнение прямого SQL-запроса, но мне также нужно искать во многих полях ACF... и это настоящий кошмар...

Nicola Boccardi Nicola Boccardi
13 окт. 2015 г. 12:12:23