カスタムWP_QueryのDESC、ASCで注文


8

クエリでマルチレベルの順序付けを行う必要があります。問題は、SQLのように1つの値をDESCに、もう1つをASCに順序付けることです。次のSQLをターミナルで実行すると、必要なものが得られるようです。

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;

pb_issue_featuredブール値です。私が必要とする最終結果は、このフィールドのメタ値が1である投稿を上部に表示するクエリです。次に、2番目の層の順序が指定されていますmenu_order(私は投稿タイプの注文プラグインを使用しています)。

問題は、ブール値を高から低(1から0)に並べる必要があるのですが、menu_orderはその逆です。プラグインで最初に注文されるもののメニュー順序は1です。そのため、WP_Queryで組み込みの「orderby」を使用しても機能しません。誰か提案がありますか?「posts_orderby」フィルターを調べましたが、取得できませんでした。それがどこに適用されるべきか、どうやってそれをトラブルシューティングできるのか本当にわかりませんでした。それは私がそれを持っていた方法を再注文しなかっただけです。

助けてくれてありがとう!関連がある場合は、実際のWP_Queryを投稿しますが、できる限り短くしたいと考えています。

クエリ引数:

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

まあ、それが正しく形成されているかどうかを確認するには、WP_Queryを投稿する必要があります。
MarinBînzari2013

それはすべての栄光です。私は現在何も注文していませんが、そのブールメタ値b / cは、そのレベルまたは並べ替えを機能させる唯一の方法でした。このサイトでは、「注目」投稿よりも優先される「ヘッドライン」投稿も使用しています。したがって、このクエリでそれらを除外します
ian

回答:


19

これを試して:

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

ボスのスパルタクのように。簡潔で正確な回答をありがとう。これは魅力のように働きました
ian 2013

1
配列をorder by句で使用することもできます(WP 4.0以降)
Blueriver '25
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.