web-dev-qa-db-fra.com

Comment commander un type d'article avec meta_value_num et si meta_value_num n'existe pas, ordre par date

Je souhaite commander une liste de publications sur la base des évaluations. J'ai utilisé la clé méta "wp_ratings" pour stocker la valeur d'évaluation dans la table wp_postmeta. Maintenant, je veux trier tous les messages. Si une publication ne contient pas la clé méta, triez-la avec la date.

$args = array(
    'post_type'         => 'recipe',
    'post_status'       => 'publish',
    'posts_per_page'    => 40,
    'orderby'           => array( 'meta_value_num' => 'DESC',  'date' => 'DESC' ),
    'meta_key'          => 'wp_ratings',
);

$my_query = new WP_Query( $args );

echo '<pre>';
var_dump( $my_query );
echo '</pre>';

Il ne m'a toujours montré que 4 articles qui ont postés de wp_ratings. Mais il ne me montre pas les 36 autres postes.

FYI: J'utilise WP 4.0.1 J'utilise ce code, mais il ne fonctionne toujours pas.

1
Aftab

Vous pouvez passer un ensemble de colonnes délimitées par des espaces à l'argument orderby de WP Query:

$args = array(
    'meta_key' => 'wp_ratings',
    'orderby'  => 'meta_value_num date'
);

$query = new WP_Query( $args );

Vous pouvez également passer un tableau de key => sort_order pour un contrôle plus granulaire, par exemple:

$args = array(
    'meta_key' => 'wp_ratings',
    'orderby' => array (
                     'meta_value_num' => 'DESC',
                     'date'           => 'ASC'
                 )
);
$query = new WP_Query( $args );

Votre problème actuel semble être lié à la requête et non à la commande. Comme meta_key a été défini, la requête cherchera une valeur pour cette clé méta. Parce que vous voulez obtenir des publications avec ou sans cette clé méta, vous devez le spécifier dans le meta_query:

$args = array(
    //meta key for orderby
    'meta_key'   => 'wp_ratings',
    //Meta query set to include when meta_key doesn't exist
    'meta_query' => array(
                        'relation' => 'OR',
                        array(
                            'key'     => 'wp_ratings',
                            'compare' => 'EXISTS'
                        ),
                        array(
                            'key'     => 'wp_ratings',
                            'compare' => 'NOT EXISTS'
                        )
                    ),
    'orderby'    => array (
                     'meta_value_num' => 'DESC',
                     'date'           => 'ASC'
                    )
);
$query = new WP_Query( $args );
4
cybmeta