Ordenar por DESC, ASC en WP_Query personalizado

13 ago 2013, 07:55:26
Vistas: 285K
Votos: 10

Necesito hacer un ordenamiento multinivel en una consulta. El problema está en ordenar un valor DESC y el otro ASC como en SQL. La siguiente consulta SQL parece darme lo que quiero cuando la ejecuto en terminal:

SELECT DISTINCT * FROM wp_posts 
INNER JOIN wp_postmeta 
ON wp_posts.ID = wp_postmeta.post_id 
WHERE wp_posts.post_type = 'post' 
AND wp_postmeta.meta_key = 'pb_issue_featured'
AND wp_posts.post_status = 'publish' 
ORDER BY wp_postmeta.meta_value DESC, wp_posts.menu_order ASC;

El pb_issue_featured es un valor booleano. El resultado final que necesito es que la consulta muestre primero los posts que tienen un valor meta de 1 para este campo, y luego todos los demás debajo. Luego, el ordenamiento de segundo nivel es el menu_order designado (estoy usando el plugin "post types order").

El problema es que mi valor booleano necesita ser ordenado de alto a bajo (1 a 0) pero el menu_order es lo opuesto. Lo que se ordena primero con el plugin tiene un menu_order de 1. Así que usar el 'orderby' incorporado en WP_Query no funciona. ¿Alguien tiene sugerencias? Investigué sobre el filtro 'posts_orderby' pero no pude hacerlo funcionar. No estaba realmente seguro de dónde debería aplicarse o cómo podría solucionarlo. Simplemente no reordenó de la manera que lo tenía.

¡Gracias por la ayuda! Publicaré la consulta WP_Query real si es relevante, pero quería mantener esto lo más breve posible.

Los argumentos de la consulta:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'post_status' => 'publish',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );
$q = new WP_Query($args);
2
Comentarios

Bueno, deberías publicar la WP_Query, para ver si está formada correctamente.

Marin Bînzari Marin Bînzari
13 ago 2013 08:53:28

Ahí está en toda su gloria. Actualmente no estoy ordenando por nada más que ese valor meta booleano porque era la única manera de hacer que ese nivel de ordenación funcionara. El sitio también utiliza publicaciones 'headline' que tienen prioridad sobre las publicaciones 'featured'. Por lo tanto, las excluyo en esta consulta

ian ian
13 ago 2013 09:02:58
Todas las respuestas a la pregunta 4
2
27

Prueba esto:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'paged' => 1,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );

add_filter( 'posts_orderby', 'filter_query' );
$q = new WP_Query($args);
remove_filter( 'posts_orderby', 'filter_query' );

function filter_query( $query ) {
    $query .= ', wp_posts.menu_order ASC';
    return $query;
}
13 ago 2013 09:14:05
Comentarios

Como un jefe Spartakus. Gracias por la respuesta concisa y precisa. Esto funcionó de maravilla

ian ian
13 ago 2013 10:18:52

También podrías usar un array en la cláusula order by (WP 4.0 y más reciente)

GuilleOjeda GuilleOjeda
25 abr 2017 16:55:53
1

ORDER BY ID ASC

$args = array(
    'order' => 'ASC',
    'orderby' => 'ID',
);

o

ORDER BY ID DESC

$args = array(
    'order' => 'DESC',
    'orderby' => 'ID',
);
2 feb 2021 04:58:54
Comentarios

No creo que eso resuelva el problema original en la pregunta, que era ordenar por dos propiedades diferentes en dos direcciones diferentes.

Rup Rup
2 feb 2021 11:21:41
1

A partir de WordPress 4.0 gracias al changeset 29027 del 08-07-2014, es posible pasar un array para orderby, según Un ORDER BY más potente en WordPress 4.0.

En 4.0, ahora puedes pasar un array a WP_Query como valor para orderby. La sintaxis se ve así:

$q = new WP_Query( array( 'orderby' => array( 'title' => 'DESC',
'menu_order' => 'ASC' ) ) );

Esto te permite controlar la generación de la cláusula ORDER BY con mayor especificidad:

ORDER BY post_title DESC, menu_order ASC

Antes de la versión 4.0, habrías tenido que usar algunos filtros complicados en la sentencia SQL o en una cláusula específica. No bueno.

1 abr 2025 01:05:52
Comentarios

(Redacté esta respuesta porque sigo olvidándome de esto, luego encuentro esta publicación de SO, y después encuentro el anuncio de WP.)

dossy dossy
1 abr 2025 01:06:39
2
-1

Cuando uses un plugin como Elementor y tengas un campo personalizado con nombre date (fecha), agrega la siguiente acción al archivo elementor-pro/elementor-pro.php en el editor de plugins.

add_action( 'elementor/query/my_custom_filter', function( $query ) {
 
    $query->set( 'meta_key', 'date' );
    $query->set( 'orderby', 'meta_value' );
    $query->set( 'order', 'DESC' );
    $query->set( 'posts_per_page', 2 );     
    
} );
28 dic 2020 17:17:55
Comentarios

¿Qué tiene que ver Elementor aquí? No hay literalmente ninguna mención de Elementor en la pregunta original ni en ninguna respuesta o comentario posterior.

Tony Djukic Tony Djukic
30 dic 2020 02:01:14

@TonyDjukic, tienes mucha razón sobre la irrelevancia de Elementor. Pero como Google me mostró esta página después de buscar mi error específico sobre la personalización de WP_Query y me tomó algo de tiempo encontrar la solución, pensé que podría ayudar a alguien más con el mismo problema.

Iman Iman
7 ene 2021 18:30:28