WP_query хуки перед выполнением поискового запроса
Кто-нибудь знает, существует ли хук перед выполнением поискового запроса (не в основном цикле), чтобы изменить параметр '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 сделали это таким образом, но это настоящий кошмар...
Как я могу подключиться к первому запросу, тому, который связан с оригинальным поиском?

Чтобы избежать разделения поисковых фраз, используйте переменную запроса 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' );
Не тестировал, но должно сработать.
Удачного кодинга!

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

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