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...!!