Trier par DESC, ASC dans WP_Query personnalisé

8

J'ai besoin de passer une commande à plusieurs niveaux dans une requête. Le problème est de commander une valeur DESC et l'autre ASC comme dans SQL. Le SQL suivant semble me donner ce que je veux quand je l'exécute dans le 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;

La pb_issue_featuredest une valeur booléenne. Le résultat final dont j'ai besoin est la requête pour afficher les messages qui ont une méta valeur de 1 pour ce champ en haut, puis tous les autres ci-dessous. Ensuite, la commande de deuxième niveau est désignée menu_order(j'utilise le plugin de commande des types de publication).

Le problème est que ma valeur booléenne doit être ordonnée de haut en bas (1 à 0) mais le menu_order est le contraire. Ce qui est commandé en premier avec le plugin a un ordre de menu de 1. Donc, utiliser le «orderby» intégré dans WP_Query ne fonctionne pas. Quelqu'un a des suggestions? J'ai regardé le filtre 'posts_orderby' mais je n'ai pas réussi à le prendre. Je ne savais pas vraiment où il devait être appliqué ni comment je pouvais le dépanner. Il n'a tout simplement pas réorganisé comme je l'avais.

Merci pour l'aide! Je publierai la WP_Query réelle si elle est pertinente, mais je voulais que cela soit aussi court que possible.

La requête argumente:

$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
la source
Eh bien, vous devriez publier le WP_Query, pour voir s'il est bien formé.
Marin Bînzari
La voilà dans toute sa gloire. Je ne commande actuellement rien d'autre que cette valeur méta booléenne b / c, c'était le seul moyen d'obtenir ce niveau ou ce tri. Le site utilise également des publications «en-tête» qui ont priorité sur les publications «en vedette». Ainsi je les exclue dans cette requête
ian

Réponses:

20

Essaye ça:

$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
la source
Comme un boss Spartakus. Merci pour la réponse concise et précise. Cela a fonctionné comme un charme
ian
1
Vous pouvez également utiliser un tableau dans la clause order by (WP 4.0 et plus récent)
Blueriver