web-dev-qa-db-ja.com

Meta_queryを使用してmeta_keyを並べ替え、日付による2次ソートを行うにはどうすればよいですか?

私は過去数日間問題をトラブルシューティングし続けてきており、円を歩き続けています。私がこの質問に答えるのを手助けするのに本当に目の新鮮なペアを使うことができます….

だから私は私が実行する必要があるクエリに関連するいくつかのカスタムフィールドが投稿に含まれているワードプレスサイトで働いています: "post-expired"と "my-sort-order"。私のquery_postsを実行するとき、私は結果が "post-expired"が "yes"ではない投稿であることを望みます(この部分は私のコードで動作します)。また、結果をDESC番号の値 "my-sort-order"でソートしたい(同様に動作します)。さらに、 "my-sort-order"に同点がある場合は、最新の投稿で日付順に並べ替えます。最初。

日付による二次ソートは私が問題を抱えているところです。

これが私が今持っているコードです:

<?php               
$args = array(
    'paged' => $paged,
    'meta_query'=> array(
        array(
            'key'=>'post-expired',
            'value'=> 'yes',
            'compare' => '!='
        )
    ),
    'meta_key'=>'my-sort-order',
    'orderby'=>'meta_value_num', 
    'order'=>'DESC'
);

$args = array_merge( $args , $wp_query->query );

query_posts( $args );
?>

上記のコードを使用して、有効期限が切れていない投稿を正しく取得し、それらをmy-sort-order降順で並べ替えます(つまり、99は99より前に表示されます、など)。しかし、両方の投稿が同じソート順の値を持っている場合、私は制御することができないような(そしてそれが実際にどのようにソートされているのか理解することができません).

これを解決するための私の最初のアイデアは、私がその投稿に特定のソート順を設定したい場合にのみ "my-sort-order"に値を追加することでした。このフィールドの値が残りの投稿で空白のままにされている場合、それらはDESC日付によるデフォルトの並べ替えで設定された並べ替え順序の投稿の後に返されるだろうと思いました。しかし、実際に起こったことはソート順の値が設定されていない投稿がまったく返されなかったということでした...

次に、orderbyフィールドに次のように複数の値を追加してみました。

('orderby'=>'meta_value_num date')

これは私が予定していたソート順を完全に破綻させ、予想外の方法で投稿を返しました。複数のorderby値が許可されているという印象を受けましたが、何らかの理由でここでは機能しません。

現時点で、私はこれらの潜在的な解決策のどちらをうまく機能させるのかわからない。 1)最初に "my-sort-order"フィールドで投稿をソートしてから、そのフィールドに値がない残りの投稿をデフォルトの日付順で返します。または2) "my-sort-order"に同点のある投稿が日付順(最新のものから順)に並べ替えられるように、並べ替えで2次的な順序を制御する方法を見つけ出しますか。

8
Dana

これまでにこの問題を解決したことを願っていますが、まだ行っていない場合は、 "posts_orderby"フィルタを使用してクエリに特定の順序でダイヤルインできるはずです。私はここで完全な解決策を与えるつもりはありませんが、あなたはより多くのためにこの記事を参照することができます: http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

編集:

ここにドキュメンテーションがあります - 基本的にあなたはただSQLのORDER BY節をオーバーライドすることができます: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

そして、これがドキュメントからのサンプルコードです:

add_filter('posts_orderby', 'edit_posts_orderby');
add_filter('posts_join_paged','edit_posts_join_paged');

function edit_posts_join_paged($join_paged_statement) {
$join_paged_statement = "LEFT JOIN wp_gdsr_data_article gdsra ON gdsra.post_id = wp_posts.ID";
return $join_paged_statement;   
}

function edit_posts_orderby($orderby_statement) {
$orderby_statement = "(gdsra.user_votes_total_sum/gdsra.user_votes_count) DESC";
return $orderby_statement;
}
2
tollmanz