pre_get_posts
フィルターを使用して組み込みのWP検索を変更し、ユーザーがさまざまなフィールドで投稿(カスタム投稿タイプの束を含む)をソートできるようにしました。
私が抱えている問題は、メタ値でソートするようにWPに指示すると、そのメタ値が設定されていないすべての投稿が除外されることです。これにより、「投稿」には「価格」が設定されていないが「アイテム」には設定されているため、ソートを「価格」から「日付」に変更すると、結果の数が変更されます。
これは私が望むものではないので、すべての投稿を含める方法があるかどうかを知りたいです-私がソートしているメタ値を欠いているものも含めて-そして値のないものを最後に置きます。
複数のフィールドでソートする方法は知っていますが、それは役に立ちません。
ありがとう
私がこの質問を持っているのは私だけではないようです:wp_queryの引数に特定のmeta_keyのある投稿とない投稿の両方を含める方法?しかし、解決策はありません。
更新
私は答えを試してみましたが、私が正しく理解したかどうかはわかりません。ここに私が今持っているものがあります:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
メタ値は数値です(名前が示すように価格を保存するために使用されます)
更新2
私は注文品をコメントアウトしました、そして、私が今持っているすべてはこれです:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
このコードでは、クエリはitem_price
キーを持たないすべての投稿を返し、キーを含む投稿はどれも返さないようです。IEの問題は今では逆転しています。
注文コードも追加すると、結果は0になります。
編集:... 3年後...:PIは再びこの問題を抱えていました。私は与えられたすべての答えを試しましたが、どれもうまくいきませんでした。なぜ一部の人々は自分が機能していると思うように見えるのかわかりませんが、少なくとも私には機能しません。
解決策はsave_post
フィルターを使用することです。すべての投稿に、並べ替えたいカスタムフィールドがあることを確認します。私はそれをやらなければならないのは少し面倒ですが、早い段階でやれば問題はないでしょう。
この場合、私は投稿に「ビューカウンター」を構築しており、ユーザーが最も読んだ投稿でソートできるようにしたかったのです。繰り返しになりますが、ビューカウントで並べ替えると、一度も表示されたことのない投稿(かなり可能性は低いとは思いますが、それでも)は消えました。すべての投稿の表示回数を確認するために、次のコードを追加しました。
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
とtax_query
され、常にarray( array() )
彼らは複数のアレイを組み合わせて。第二-私の答えで述べたように-あなたmeta_value_num
は数字に使用する必要があります。実際に定義する必要があるかもしれませんmeta_value_num
(WP_Query
-Codexページエントリを参照)。最後には、それはしても意味がありませんorder
でASC
して DESC
方向。それは可能ではありません。スペース区切り文字は機能するだけでorderby
、最初ASC
と2番目をソートするように指示することはできませんDESC
。それがposts_clauses
フィルターの目的です。
meta_value_num
エントリが実数であることを確認してください。誰かがそれが数字であると述べるが、実際にはそれを文字列としてデータベースに保存することを頻繁に見ました。
ASC DESC
それが上でソートするほどでmeta_value
中ASC
とdate
でDESC
、私はそれが動作伝えることができる限り、。