Ordenar por DESC, ASC en WP_Query personalizado
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);
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;
}

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

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 );
} );

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

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