Ordenar por DESC, ASC no WP_Query personalizado

8

Preciso fazer pedidos em vários níveis em uma consulta. O problema está em solicitar um valor DESC e o outro ASC como no SQL. O SQL a seguir parece me dar o que eu quero quando o executo no 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;

O pb_issue_featuredé um valor booleano. O resultado final de que preciso é a consulta para exibir postagens que tenham um meta-valor 1 para esse campo na parte superior e depois todas as outras abaixo. Em seguida, a ordem da segunda camada é a designada menu_order(estou usando o plug-in de ordem de tipos de postagem).

A questão é que meu valor booleano precisa ser ordenado de alto a baixo (1 a 0), mas o menu_order é o oposto. O que é pedido primeiro com o plug-in tem uma ordem de menu igual a 1. Portanto, o uso do 'orderby' incorporado no WP_Query não funciona. Alguém tem sugestões? Eu olhei no filtro 'posts_orderby', mas não consegui. Não tinha muita certeza de onde deveria ser aplicado ou como eu poderia solucionar o problema. Simplesmente não reordenou do jeito que eu tinha.

Obrigado pela ajuda! Vou postar o WP_Query real, se for relevante, mas eu queria manter isso o mais curto possível.

A consulta args:

$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
fonte
Bem, você deve postar o WP_Query, para ver se ele está formado corretamente.
Marin Bînzari
Lá está em toda a sua glória. No momento, não estou ordenando nada além do meta-valor booleano b / c que era a única maneira de obter esse nível ou classificação funcionando. O site também usa postagens de 'título' que têm precedência sobre postagens de 'destaque'. Assim, eu os excluo nesta consulta
Ian

Respostas:

19

Tente o seguinte:

$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
fonte
Como um chefe Spartakus. Obrigado pela resposta concisa e precisa. Isso funcionou como um encanto
ian
1
Você também pode usar uma matriz na ordem pela cláusula (WP 4.0 e mais recentes)
Blueriver