並べ替え:orderby meta_value_num THENを使用したカスタムクエリ


8

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

希望する出力:
映画タイトル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!

これが結果のSQLクエリです $GLOBALS['wp_query']->request

SELECT wp_posts。*
wp_posts FROM
       INNER JOINは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を= 'movies'
       AND(wp_posts.post_status = 'publish')
       AND(wp_postmeta.meta_key = 'year')
GROUP BY wp_posts.id
ORDER BY wp_postmeta.meta_value + 0、
          wp_posts.post_title DESC 

回答:


1

これは大雑把ですが、投稿を年(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);

できます!どうもありがとうございました。ZにAをソートするalter_order機能でけれども私はDESCにASCを変更
kyii

ASCAZを短くする必要があります。DESCZAをソートする必要があります。
s_ha_dum 2013年

1

あなたの問題は同じくらいではないorderbyと同じようにorder。一方でorderby、複数の値を受け入れ、自分の使用がOKに見える、order 唯一の受け入れASC DESC

サニタイズ後orderorderby処理の出力に追加されます。複数のorderbyパラメーターのうち、order最後にリストされているパラメーターに適用されることを意味するロジックの権利を理解している場合。

タイトルをデフォルトで並べ替え、タイトルではなく年に適用されるように逆にorderby'title meta_value_num'てみてくださいorder


rarstありがとうございます。しかし、残念ながら値を逆にすると、並べ替え順序がmeta_value_numを無視してAZだけが得られます(ORDERがDESCまたはASCであるかどうかに関係なく同じ順序であるという事実から推測)
kyii

@kyii「同じ順序でも」という意味がわかりませんか?
Rarst

ごめんなさい。あなたが提案したように私が逆の場合、投稿のAZ順を取得order =>します。クエリフォームのパラメーターをASCからDESCに変更しても、同じです。だから私はmeta_value_numが適用されていないと思います。ですから、ORDERとORDERBYの相互作用のロジックについての興味深い点は、おそらくどこか違うのでしょうか?または私はそれを間違っていますか?
kyii 2013年

@kyiiわかりません...異なる組み合わせで結果のクエリをダンプしようとします。ただし、最終的にはSQLを変更する必要があると思います。このロジックは、より複雑なソートには制限が多すぎます。
Rarst
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.