Добавление пользовательских полей в поиск WordPress
Я хочу добавить пользовательские поля ("introduction" и "ensavoirplus") в поиск WordPress, но SQL запрос формируется неверно. Я не понимаю, делаю ли я ошибку или WordPress не поддерживает такую возможность. Моя попытка не работает... Я не знаю почему, ведь я делаю всё точно по документации Codex.
Вот мой код:
function recherche_avancee( $query ) {
if ( !is_admin() && $query->is_search ) {
$custom_fields = array(
"introduction",
"en_savoir_plus_page"
);
$meta_query = array('relation' => 'OR');
foreach($custom_fields as $cf) {
array_push($meta_query, array(
'key' => $cf,
'value' => $_GET['s'],
'compare' => 'LIKE'
));
}
$query->set("meta_query", $meta_query);
}
}
add_action( 'pre_get_posts', 'recherche_avancee');
А вот SQL запрос, который формируется:
1. SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
2. FROM wp_posts
3. INNER JOIN wp_postmeta
4. ON ( wp_posts.ID = wp_postmeta.post_id )
5. WHERE 1=1
6. AND (((wp_posts.post_title LIKE '%environnement%')
7. OR (wp_posts.post_content LIKE '%environnement%')))
8. AND wp_posts.post_type IN ('post', 'page', 'attachment')
9. AND (wp_posts.post_status = 'publish'
10. OR wp_posts.post_status = 'miseenavant'
11. OR wp_posts.post_author = 3
12. AND wp_posts.post_status = 'private')
13. AND ( ( wp_postmeta.meta_key = 'introduction'
14. AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%environnement%' )
15. OR ( wp_postmeta.meta_key = 'en_savoir_plus_page'
16. AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%environnement%' ) )
17. GROUP BY wp_posts.ID
18. ORDER BY wp_posts.menu_order ASC
19. LIMIT 0, 10
Ошибки в строке 13, потому что мне нужно OR вместо AND, а строки 13,14,15,16 должны идти сразу после строки 7, чтобы всё работало правильно.
Кто-нибудь сталкивался с подобной ошибкой и если да, то в чём причина?
Спасибо

Благодаря WordPress 4.1 вы можете улучшить работу с meta_query: https://make.wordpress.org/core/2014/10/20/update-on-query-improvements-in-4-1/
function recherche_avancee($query) {
if (!is_admin() && $query->is_search) {
$meta_query = array(
'relation' => 'OR',
array(
'relation' => 'OR',
array(
'key' => 'introduction',
'value' => get_search_query(),
'compare' => 'LIKE',
),
array(
'key' => 'en_savoir_plus_page',
'value' => get_search_query(),
'compare' => 'LIKE',
),
),
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'recherche_avancee');
Не тестировал, но суть вы поняли...

пожалуйста, никогда не делайте так: 'value' => $_GET['s']
... $query->get('s');
, get_search_query, или sanitize_key($_GET['s'])
— все это более безопасные варианты. Технически, нам вообще не следует использовать GET-параметры в WordPress, это не лучшая практика. Это значение GET может содержать всякие неприятные вещи, и мы не хотим передавать его в базу данных, не убедившись, что оно чистое.
Кроме того, вы используете оператор LIKE
... так что, возможно, стоит добавить кавычки вокруг значения для более строгого соответствия.
'value' => '"'.$query->get('s').'"';

Я просмотрел ваш код, но не могу найти, что не так с вашим кодом. У меня есть простое решение. Вы можете использовать бесплатный сторонний плагин для WordPress — WP Extended Search — и выбрать мета-ключи, которые хотите добавить в результаты поиска. Этот плагин помогает расширить стандартный поиск WordPress и включить в результаты поиска метаданные записей, таксономии и пользовательские типы записей.
WP Extended Search: https://wordpress.org/plugins/wp-extended-search/
Надеюсь, это поможет...!!
