web-dev-qa-db-ja.com

カスタムWP_QueryでのDESC、ASCによる順序

クエリ内でマルチレベルの順序付けをする必要があります。問題は、SQLの場合のように、1つの値DESCと他の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);
5
ian

これを試して:

$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