Ordenar por múltiples claves meta y valores meta

16 nov 2016, 11:20:53
Vistas: 43.6K
Votos: 23

¿Cómo puedo establecer un orden por múltiples claves meta ordenadas por valor meta? ¿Alguien puede darme algún ejemplo?

2
Comentarios

Bienvenido a WPSE - para que podamos ayudarte, necesitas ayudarnos. ¿Puedes describir con más detalle lo que estás intentando hacer, y quizás compartir algunos ejemplos de código?

TheDeadMedic TheDeadMedic
16 nov 2016 11:44:21

No entiendo por qué esto fue cerrado o se solicitó más información, esto es muy directo, claro y con las etiquetas correctas...

jave.web jave.web
10 jun 2021 13:07:09
Todas las respuestas a la pregunta 1
5
49

meta_query es un array de cláusulas de metadatos. Por ejemplo:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
) );

Puedes usar un array asociativo, con una clave para cada cláusula de metadatos:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
) );

Luego, puedes usar esas claves en el argumento order_by, con una:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => 'city_clause', // Los resultados se ordenarán por los valores de metadatos 'city'.
) );

O más cláusulas:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => array( 
        'city_clause' => 'ASC',
        'state_clause' => 'DESC',
    ),
) );

Ejemplo tomado de esta publicación en el blog Make WordPress Core.

16 nov 2016 11:45:28
Comentarios

no olvides agregar el tipo de la clave/valor meta. Esto afectará los resultados. Por defecto, WordPress tratará tu meta como una cadena.

Alexander Ivashchenko Alexander Ivashchenko
12 dic 2018 13:54:03

Pero, ¿qué pasa si no solo quiero devolver resultados donde el estado es Wisconsin? Quiero que se devuelvan todos los estados y quiero filas donde pueda o no haber una ciudad y aún así ordenar por esos 2 campos. Por ejemplo, sin ninguna cláusula WHERE, solo un ORDER BY.

Felix Eve Felix Eve
9 may 2019 12:40:14

Felix, con esos requisitos, una solución alternativa podría ser incluir una cláusula final 'catch all' en tu meta_query, y colocarla al final en tu declaración orderby. Así, las primeras cláusulas en tu meta_query obtendrían los resultados específicos que deseas ordenar primero. Luego, tu última cláusula sería todo lo que no sean tus cláusulas anteriores.

Matt Keys Matt Keys
2 oct 2020 22:30:13

EXISTS es una forma genial de obtener la consulta de metadatos con nombres complejos pero al mismo tiempo no filtrar por el valor :) Por cierto: tuve un caso de uso real - el requerimiento era ordenar eventos por fecha DESC pero hora ASC usando un solo campo de fecha&hora Usé la documentación y esta respuesta para construir esto: https://ideone.com/RUoyZs :-)

jave.web jave.web
10 jun 2021 14:23:17

Wow esto es muy interesante

user2128576 user2128576
5 mar 2022 09:00:37