次の条件に一致するようにカスタム投稿タイプのクエリを実行します。
映画を年の降順で並べ替えます。
その後(アルファベット順でタイトル順に「年」の「内側」)。
望ましい出力:
映画タイトルA、2006年
映画タイトルZ、2006
...
映画タイトルA、1996
映画タイトルZ、1996
私は以下のコードを使います。
$wp_query = new WP_Query();
$wp_query->query( array(
'post_type' => 'movies',
'distribution' => 'companyA',
'meta_key' => 'year',
'orderby' => 'meta_value_num title',
'order' => 'DESC',
'posts_per_page' => -1,
'post_status' => 'publish',
));
私はいくつかのことを試したが、私はこの "逆の"結果しか得られない:
映画のタイトルA、1996
映画タイトルZ、1996
...
映画タイトルA、2006年
映画タイトルZ、2006
dESC、ASCを変更した場合、タイトルの並べ替えのみが変更されます。しかし、私はそれをタイトルではなく年に適用する必要があります。
2つのorderby値を使うのは正しい方法でしょうか。または私はmeta_queryまたはカスタムSQLを使用する必要がありますか?
事前にTHX!
これは$GLOBALS['wp_query']->request
からの結果のSQLクエリです。
SELECT wp_posts。*
wp_postsから
内部結合wp_term_relationships
ON(wp_posts.id = wp_term_relationships.object_id)
内部結合wp_postmeta
ON(wp_posts.id = wp_postmeta.post_id)
WHERE 1 = 1
AND(wp_term_relationships.term_taxonomy_id IN(24))
AND wp_posts.post_type = '映画'
AND(wp_posts.post_status = 'publish')
AND(wp_postmeta.meta_key = 'year')
グループ化wp_posts.id
wp_postmeta.meta_valueによる注文+ 0、
wp_posts.post_title DESC
これは非常に粗雑ですが、投稿を年(meta_value)で、次にタイトルでソートする必要があります。それはクエリがどのように設定されているかに依存するので、それは以下のクエリまたは同様のものでのみ機能します。
function alter_order_wpse_103181($order,$qry) {
remove_filter('posts_orderby','alter_order',1,2);
$order = explode(',',$order);
$order = implode( ' ASC,',$order);
return $order;
}
add_filter('posts_orderby','alter_order_wpse_103181',1,2);
$q = new WP_Query();
$q->query( array(
'post_type' => 'movies',
'distribution' => 'companyA',
'meta_key' => 'year',
'orderby' => 'meta_value_num title',
'order' => 'ASC',
'posts_per_page' => -1,
'post_status' => 'publish',
));
var_dump($q->request);
あなたの問題はorderby
と同じくらい多くありません。 order
は複数の値を受け入れ、使用法は問題ないようですが、orderby
only はorder
または ASC
を受け入れます。
サニタイズ後、DESC
がorder
処理の出力に追加されます。複数のorderby
パラメータのうち、論理orderby
パラメータを使用することを意味する論理的権利を私が理解していれば、order
は最後にリストされたものに適用されます。
orderby
を'title meta_value_num'
に反転して、タイトルがデフォルトでソートされ、order
がタイトルの代わりに年に適用されるようにします。