Añadir campos personalizados a la búsqueda en WordPress

8 ene 2015, 12:05:23
Vistas: 13.6K
Votos: 6

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

0
Todas las respuestas a la pregunta 3
1

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

9 ene 2015 11:29:05
Comentarios

Gracias por tu respuesta, la primera relación de orden "OR" no cambia el "AND" (antes del primer meta_key) en el código SQL... Vi el cambio diferente desde WP 4.1 en el orden de meta_query, siento que esto no soluciona mi problema: /

ecaLdipS ecaLdipS
9 ene 2015 12:28:37
0

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').'"';
7 nov 2018 22:29:08
0
-1

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/

Plugin WP Extended Search para WordPress

Espero que esto ayude...!!

26 jun 2018 20:23:35