meta_queryを使用してquery_postsでmeta_keyをorderbyし、日付で2次ソートする方法は?


8

私は過去数日間にわたって問題のトラブルシューティングを行っており、サークルに行き続けています。この質問に答えるために、新鮮な目を実際に使うことができました...

そのため、実行する必要のあるクエリに関連するいくつかのカスタムフィールド "post-expired"と "my-sort-order"が含まれているワードプレスサイトを使用しています。query_postsを実行すると、結果が "post-expired"が "yes"ではないpostになるようにします(この部分は私のコードで機能します)。「my-sort-order」のDESC番号の値で結果を並べ替えることもできます(同様に機能します)。また、「my-sort-order」にタイがある場合、最新の投稿で日付で2番目の並べ替えが必要です。最初。

日付による2番目の並べ替えは、問題が発生している場所です。

ここに私が今持っているコードがあります:

<?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の降順で並べ替えます(つまり、100は99の前に表示されるなど)。しかし、両方の投稿に同じ並べ替え順序の値がある場合、制御できないように見える(そして実際に何に並べ替えられているのかわからない)ある種類の二次並べ替えが発生します。

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

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

('orderby'=>'meta_value_num date')

それは私がしようとしていた両方の並べ替え順序を完全に破壊し、予期しない方法で投稿を返しました。複数のorderby値が許可されているように見えましたが、何らかの理由でここでは機能しません。

現時点では、これらの潜在的なソリューションのいずれかを機能させる方法がわかりません。誰でも私がどのようにできるか知っていますか1)最初に「my-sort-order」フィールドで投稿を並べ替え、次にそのフィールドに値のない残りの投稿をデフォルトの日付の並べ替えで返します。または2)「my-sort-order」に関連のある投稿が日付順(最新が最初)にソートされるように、2次orderbyソートを制御する方法を理解しますか?

回答:


2

うまくいけば、これでこれまでに理解できたと思いますが、まだ理解していない場合は、「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;
}

はい、posts_orderbyフィルターはあなたが探しているものです。そのリンクのコードで回答を編集します...
mltsy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.