web-dev-qa-db-fra.com

Commande par DESC, ASC dans WP_Query personnalisé

J'ai besoin de commander à 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 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;

Le pb_issue_featured est une valeur booléenne. Le résultat final dont j'ai besoin est la requête pour afficher les publications qui ont une méta-valeur de 1 pour ce champ en haut, puis toutes les autres ci-dessous. Ensuite, la commande de second niveau est le menu_order désigné (j'utilise le plugin post types order).

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é dans le filtre 'posts_orderby' mais je n'ai pas réussi à le prendre. Je ne savais pas vraiment où il devrait être appliqué ni comment je pourrais le résoudre. Cela n'a tout simplement pas été ordonné comme je l'avais fait.

Merci pour l'aide! Je publierai le WP_Query actuel s'il est pertinent, mais je voulais le garder aussi court que possible.

La requête affirme:

$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);
5
ian

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;
}
14
Marin Bînzari