web-dev-qa-db-ja.com

並べ替え:orderby meta_value_numを持つカスタムクエリ

次の条件に一致するようにカスタム投稿タイプのクエリを実行します。
映画を年の降順で並べ替えます。
その後(アルファベット順でタイトル順に「年」の「内側」)。

望ましい出力:
映画タイトル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

8
kyii

これは非常に粗雑ですが、投稿を年(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);
1
s_ha_dum

あなたの問題はorderbyと同じくらい多くありません。 orderは複数の値を受け入れ、使用法は問題ないようですが、orderby only order または ASCを受け入れます。

サニタイズ後、DESCorder処理の出力に追加されます。複数のorderbyパラメータのうち、論理orderbyパラメータを使用することを意味する論理的権利を私が理解していれば、orderは最後にリストされたものに適用されます。

orderby'title meta_value_num'に反転して、タイトルがデフォルトでソートされ、orderがタイトルの代わりに年に適用されるようにします。

1
Rarst