Ordenar por valor de campo personalizado

24 feb 2016, 14:17:21
Vistas: 27K
Votos: 10

Basado en el ejemplo de https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

Me gustaría modificar la consulta

$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') );

para poder obtener todos los posts donde state sea 'Wisconsin' O timezone sea 'central' ORDENADOS POR population DESC

3
Comentarios

Por favor no pidas lo mismo en dos hilos diferentes :)

fischi fischi
24 feb 2016 15:14:10

Claro - disculpa por eso

dkatwp dkatwp
25 feb 2016 19:33:37

¿Esto responde tu pregunta? Consulta personalizada con orderby meta_value de campo personalizado

sampi sampi
13 jun 2020 11:08:32
Todas las respuestas a la pregunta 2
0
15

Puedes crear grupos de meta_queries utilizando operaciones de comparación específicas en ellos, y como quieres ordenar basado en un solo campo personalizado, puedes mantener la declaración de orden dedicada a ese único meta campo. Entonces:

$q = new WP_Query( 
    array(
        'meta_key' => 'poblacion', //estableciendo el meta_key que se usará para ordenar
        'orderby' => 'meta_value', //si el meta_key (poblacion) es numérico usa meta_value_num en su lugar
        'order' => 'DESC', //estableciendo la dirección del orden
        'meta_query' => array(
            'relation' => 'AND', //estableciendo la relación entre grupos de queries
            array(
                'relation' => 'OR', //estableciendo la relación para esta query interna
                array(
                    'key' => 'estado',
                    'value' => 'Wisconsin',
                ),
                array(
                    'key' => 'zona_horaria',
                    'value' => 'central',
                )
            ),
            array(
                'key' => 'ciudad',
                'compare' => 'EXISTS',
            )
        )
    )           
);
24 feb 2016 15:51:20
4

Esto se haría de la siguiente manera:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            'state_clause' => array(
                'key' => 'state',
                'value' => array( 'Wisconsin' ), //valores permitidos
                'compare' => 'IN' // el estado debe estar en el array anterior
            ),
            'state_clause' => array(
                'key' => 'timezone',
                'value' => 'central',
                'compare' => '='
            ),
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS', // compara si existe
        ), 
    ),
    'orderby' => array(
        'city_clause' => 'DESC', // orden descendente
    ),
) );
24 feb 2016 15:14:12
Comentarios

Gracias @fischi - pero tengo dos problemas con esa solución: 1) el valor de 'state_clause' en el array meta_query se sobrescribe - así que solo la última declaración permanece ('timezone') si haces un dump de la consulta. 2) la 'relation' => 'OR' arruina la lógica de la consulta - ahora el resultado son todos los posts ya que population existe en todos los casos (y solo queremos los que tienen state como 'Wisconsin' o timezone como 'central'

dkatwp dkatwp
24 feb 2016 15:32:16

mira la respuesta para la actualización.

fischi fischi
24 feb 2016 16:11:04

¡Gracias! repetir 'state_clause' en el array para las claves state y timezone no funcionaría - así que necesité hacerlo como @Bruno Cantuaria sugirió arriba. Sin embargo, la solución de Bruno no funcionó para mí sin declarar city_clause y llamarlo en 'orderby'. Así que gracias de nuevo

dkatwp dkatwp
24 feb 2016 17:06:31

¡No hay problema. Me alegra ayudar!

fischi fischi
24 feb 2016 17:23:19