Ordenar por DESC, ASC en WP_Query personalizado

8

Necesito hacer pedidos de varios niveles en una consulta. El problema está en ordenar un valor DESC y el otro ASC como en SQL. El siguiente SQL parece darme lo que quiero cuando lo ejecuto en la 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_featuredes un valor booleano. El resultado final que necesito es la consulta para mostrar las publicaciones que tienen un metavalor de 1 para este campo en la parte superior, luego todos los demás a continuación. Luego, el orden de segundo nivel es el designado menu_order(estoy usando el complemento de orden de tipos de publicación).

El problema es que mi valor booleano debe ordenarse de mayor a menor (1 a 0) pero el menú_orden es lo contrario. Lo que se ordena primero con el complemento tiene un orden de menú de 1. Por lo tanto, usar el 'orderby' incorporado en WP_Query no funciona. Alguien tiene sugerencias? Miré en el filtro 'posts_orderby' pero no pude conseguirlo. No estaba realmente seguro de dónde debería aplicarse o cómo podría solucionarlo. Simplemente no reordenó como lo tenía.

¡Gracias por la ayuda! Publicaré el WP_Query real si es relevante, pero quería mantenerlo lo más corto posible.

La consulta argumenta:

$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);
ian
fuente
Bueno, debe publicar el WP_Query, para ver si está formado correctamente.
Marin Bînzari
Ahí está en toda su gloria. Actualmente no estoy ordenando por nada más que ese metavalor booleano b / c, era la única forma de hacer que ese nivel o clasificación funcionara. El sitio también utiliza publicaciones de 'título' que tienen prioridad sobre las publicaciones 'destacadas'. Por lo tanto, los excluyo en esta consulta
ian

Respuestas:

20

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;
}
Marin Bînzari
fuente
Como un jefe Spartakus. Gracias por la respuesta concisa y precisa. Esto funcionó a las mil
maravillas
1
También podría usar una matriz en el orden por cláusula (WP 4.0 y más reciente)
Blueriver