Añadir campos personalizados a la búsqueda en WordPress
Quiero añadir campos personalizados ("introduction" y "ensavoirplus") a la búsqueda de WordPress, pero el código SQL no es exacto. No entiendo si estoy cometiendo un error o si WordPress no puede hacer esto. Pero mi intento falla... No sé por qué porque hice exactamente lo que dice el codex.
Este es mi código:
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');
Y este es el código SQL generado:
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
Los errores están en la línea 13, porque no quiero un AND sino un OR y las líneas 13,14,15,16 deberían ir justo después de la línea 7 para que todo funcione.
¿Alguien ya tuvo el mismo tipo de error y si es así de dónde vino?
Gracias

Gracias a WordPress 4.1 puedes hacer mejoras para meta_query: https://make.wordpress.org/core/2014/10/20/update-on-query-improvements-in-4-1/
function busqueda_avanzada($query) {
if (!is_admin() && $query->is_search) {
$meta_query = array(
'relation' => 'OR',
array(
'relation' => 'OR',
array(
'key' => 'introduccion',
'value' => get_search_query(),
'compare' => 'LIKE',
),
array(
'key' => 'mas_informacion_pagina',
'value' => get_search_query(),
'compare' => 'LIKE',
),
),
);
$query->set('meta_query', $meta_query);
}
}
add_action('pre_get_posts', 'busqueda_avanzada');
No lo he probado pero entiendes la idea...

por favor nunca hagas esto: 'value' => $_GET['s']
... $query->get('s');
, get_search_query, o sanitize_key($_GET['s'])
son todas opciones más seguras. Técnicamente no deberíamos usar parámetros GET en WordPress para nada, no es una buena práctica. Ese valor GET podría ser todo tipo de cosas malas, y no queremos pasarlo a la base de datos sin asegurarnos de que esté limpio.
Además, estás usando el operador LIKE
... así que quizás quieras añadir comillas alrededor del valor para una coincidencia más estricta.
'value' => '"'.$query->get('s').'"';

He revisado tu código pero no encuentro qué está mal en tu código. Tengo una solución sencilla. Puedes usar un plugin gratuito de WordPress de terceros, WP Extended Search, y seleccionar las meta claves que quieras añadir en tus resultados de búsqueda. Este plugin ayuda a extender la búsqueda predeterminada de WordPress e incluir metadatos de entradas, taxonomías y tipos de contenido personalizados en los resultados de búsqueda.
WP Extended Search: https://wordpress.org/plugins/wp-extended-search/
Espero que esto ayude...!!
