Búsqueda en tipo de entrada personalizada por metadatos

28 ene 2014, 17:48:50
Vistas: 19.6K
Votos: 6

Tengo un tipo de entrada personalizada 'Property' que mis usuarios necesitan poder buscar por metadatos.

Tengo 3 funciones de búsqueda - 2 en el frontend y 1 en el área de administración - 2 de las cuales funcionan correctamente y una que no parece filtrar los resultados.

Creo que puede haber un problema con mi definición o uso de custom query_vars.

En mi functions.php tengo lo siguiente:

function add_query_vars($public_query_vars) {
    $public_query_vars[] = 'bedrooms';
    $public_query_vars[] = 'type';
    $public_query_vars[] = 'location';
    return $public_query_vars;
}
add_filter('query_vars', 'add_query_vars');

function meta_search_query($query) {

    $query_args_code = array(
      'posts_per_page' => 5,
      'post_type' => 'nc_property',
      'meta_key' => 'nc_code',
      'meta_value' => $query->query_vars['s'],
      'meta_compare' => 'LIKE'
    );


    $query_args_meta = array(
        'posts_per_page' => -1,
        'post_type' => 'nc_property',
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'nc_bedrooms',
                'value' => $query->query_vars['bedrooms'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'nc_type',
                'value' => $query->query_vars['type'],
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'nc_location',
                'value' => $query->query_vars['location'],
                'compare' => 'LIKE'
            )
        )
    );

    if (is_admin() && $query->is_search ) {
        query_posts($query_args_code);

    } elseif (!is_admin() && $query->is_search ) {
        if ($_REQUEST["which_form"] == 'meta_form') {
            query_posts($query_args_meta);

        } elseif ($_REQUEST["which_form"] == 'code_form'){
            query_posts($query_args_code);

        }
    }  
}
add_filter( 'pre_get_posts', 'meta_search_query');

Buscar por el código de propiedad funciona sin problemas tanto en el frontend como en el backend, sin embargo intentar filtrar resultados por las query vars personalizadas - location, type y bedrooms - no funciona.

Un ejemplo de cadena de búsqueda que se crea es el siguiente:

/property/?post_type=nc_property&which_form=meta_form&bedrooms=Two&type=Apartment&location=Bahceli

Hay una propiedad en el sitio que coincide con esos detalles pero WordPress devuelve todos los resultados cada vez.

¿Me he olvidado de algo?

EDIT: Resulta que como mi formulario de búsqueda para las consultas de metadatos no estaba usando un elemento con 's' como nombre, la condición $query->is_search de mi sentencia if devolvía false, lo que significa que mi meta_query simplemente no se estaba llamando.

¡Créditos a fischi por darse cuenta de esto por mí! :D

5
Comentarios

¿WordPress reconoce las variables de consulta personalizadas? Si haces un var_dump, ¿obtienes valores en $query->query_vars?

fischi fischi
28 ene 2014 18:10:28

Hmm, todas las variables de consulta personalizadas están devolviendo NULL cuando hago var_dump. ¿Por qué pasaría esto?

Jazibobs Jazibobs
28 ene 2014 18:16:11

Probablemente porque tienes una mezcla de permalinks bonitos y variables $_GET. ¿Puedes intentar insertar los datos de $_GET en lugar de $query->query_vars? No olvides sanitizarlos si vas por este camino :)

fischi fischi
28 ene 2014 18:18:59

usar $_GET devuelve las variables como se espera: array(3) { [0]=> string(3) "Two" [1]=> string(9) "Apartment" [2]=> string(7) "Bahceli" } ¿crees que un simple reemplazo por $_GET en mi functions.php resolverá el problema?

Jazibobs Jazibobs
28 ene 2014 18:29:43

¿Esto responde a tu pregunta? Usar get_posts con argumentos encontrados en meta keys

T.Todua T.Todua
30 ene 2021 19:09:51
Todas las respuestas a la pregunta 1
6

En este caso, al mezclar enlaces permanentes con parámetros de solicitud, usaría las variables $_GET en tu consulta.

$query_args_meta = array(
    'posts_per_page' => -1,
    'post_type' => 'nc_property',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'nc_bedrooms',
            'value' => sanitize_text_field( $_GET['bedrooms'] ),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'nc_type',
            'value' => sanitize_text_field( $_GET['type'] ),
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'nc_location',
            'value' => sanitize_text_field( $_GET['location'] ),
            'compare' => 'LIKE'
        )
    )
);

Asegúrate de utilizar la sanitización adecuada, dependiendo de tus necesidades, o usando una función que verifique valores permitidos en los datos $_GET.

También verifica la función de los condicionales - solo modificas la consulta si es una solicitud de búsqueda (usando s como parámetro de búsqueda), o modifica la declaración if.

28 ene 2014 18:35:31
Comentarios

He realizado los cambios que recomendaste, sin embargo, los resultados de búsqueda aún no parecen filtrarse de ninguna manera, aunque sé que las variables $_GET se están recogiendo correctamente cuando hago var_dump...

Jazibobs Jazibobs
28 ene 2014 18:38:13

¿Puedes revisar qué consulta está ejecutando tu WordPress? <?php echo $GLOBALS['wp_query']->request; ?>

fischi fischi
28 ene 2014 18:42:07

La consulta es la siguiente SELECT SQL_CALC_FOUND_ROWS north_posts.ID FROM north_posts WHERE 1=1 AND north_posts.post_type = 'nc_property' AND (north_posts.post_status = 'publish' OR north_posts.post_status = 'private') ORDER BY north_posts.post_date DESC LIMIT 0, 10

así que parece que mi meta query simplemente está siendo ignorada? :/

Jazibobs Jazibobs
28 ene 2014 18:45:28

ups, vi otra cosa - si no usas el parámetro s tu condición if (!is_admin() && $query->is_search ) no se cumple, ya que WordPress no sabe que es una búsqueda. Intenta cambiar eso también.

fischi fischi
28 ene 2014 19:03:40

¡Eres un héroe de WordPress! ¡Hacer que uno de los campos de búsqueda tenga el nombre 's' ha resuelto el problema!

Jazibobs Jazibobs
28 ene 2014 19:14:14

Genial. He actualizado la respuesta :)

fischi fischi
28 ene 2014 19:16:24
Mostrar los 1 comentarios restantes