web-dev-qa-db-ja.com

Meta_value_numで投稿タイプを並べる方法とmeta_value_numが存在しない場合は日付順で並べる方法

評価に基づいて投稿のリストを注文したいのですが。 wp_postmetaテーブルに評価値を格納するためにメタキー "wp_ratings"を使用しました。今、私はすべての記事を並べ替えたいです。投稿にメタキーが含まれていない場合は、日付で並べ替えます。

$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>';

それはまだ私にwp_ratings postmetaを持っている4つの記事だけを見せています。しかし、それは私に残りの36の記事を見せていません。

参考:私はWP 4.0.1を使用しています。このコードを使用していますが、まだ機能しません。

1
Aftab

スペース区切りの列のセットをWP Queryのorderby引数に渡すことができます。

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

$query = new WP_Query( $args );

より細かい制御のためにkey => sort_orderの配列を渡すこともできます。例えば:

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

あなたの実際の問題は、順番ではなくクエリに関連しているようです。 meta_keyが設定されると、クエリはそのメタキーの値を探します。そのメタキーの有無にかかわらず投稿を取得したいので、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