web-dev-qa-db-fra.com

Commande par meta_value ET date NE FONCTIONNE PAS avec wp_query

Je souhaite sélectionner les publications et le type de publication personnalisé avec une méta valeur spécifique (mb_home! = 0) de la semaine dernière et les COMMANDER par mb_home. S'ils ont la même valeur mb_home, je veux qu'ils soient classés par date. Les deux commandes doivent être DESC.

J'utilise cette requête mais cela ne fonctionne tout simplement pas:

$query = new WP_Query( array(
            'post_type' => array ('post', 'aggregato'),
            'posts_per_page' => 13,
            'post__not_in' => $linked_posts,
            'meta_key' => 'mb_home',
            'orderby' => 'meta_value_num date',
            'order' => 'DESC',
            'meta_query' => array(
                                array(
                                        'key' => 'mb_home',
                                        'value' => '0',
                                        'compare' => '>',
                                    )
                            ),
            'date_query' => array(
                                    'after' => '1 week ago',
                            )
            ));

Si je laisse tomber date et utilise 'order by' => 'meta_value_num', la requête me renvoie les résultats correctement ordonnés par mb_home DESC. Mais s'ils ont la même valeur mb_home, ils sont classés par date ASC.

Si j'essaie de changer ma façon de commander, en utilisant cette syntaxe:

'orderby' => array( 'meta_value_num' => 'DESC', 'date' => 'DESC' ),

au lieu des instructions orderby et order ci-dessus, il revient simplement à DESC en ignorant complètement la valeur mb_home.

Tous ces résultats sont les mêmes avec meta_value au lieu de meta_value_num. Rien ne change.

S'il vous plaît, donnez-moi des indications, car cela fait presque un mois que je suis sur ce sujet, j'ai tout essayé mais je n'y suis pas parvenu.

Oh, maîtres de wordpress! J'invoque ton aide !!

2
Alevalentini

Vous devez utiliser le filtre posts_orderby pour le faire au mo, par exemple

function wpse159469_posts_orderby( $orderby, $query ) {
    return implode( ' DESC,', explode( ',', str_replace( array(' ASC', ' DESC' ), '', $orderby ) ) ) . ' DESC';
}

puis autour de votre requête:

add_filter( 'posts_orderby', 'wpse159469_posts_orderby', 10, 2 );
$query = new WP_Query( array( // etc
remove_filter( 'posts_orderby', 'wpse159469_posts_orderby', 10 );
2
bonger