web-dev-qa-db-ja.com

WordpressのOrderby数値が機能しない

Wpsc-product投稿タイプからすべての商品を取得して、それらをrelease_date_yearというカスタムメタフィールドで表示しようとしています。ただし、このカスタムメタ値で投稿を並べ替えているようには見えません。

私は数え切れないほどのブログ記事、Wordpressフォーラムのサポート記事、そしてWordpress Answersでのたくさんの質問と回答を読みました。しかし、私は自分の問題に対する解決策を見つけることができませんでした。

これは、商品を入手してカスタムメタフィールドで注文するためのコードです。 each_connected引数は、Scribuによるプラグインの投稿への投稿と同じように無視してください。ちょっとしたメモ:私はeach_connected部分を削除して問題が解決したかどうかを確認しましたが、私は疑ったように、それはものを変えませんでした。

以下のコードで製品が正常に処理されるように見えますが、それは問題ではありません。問題は、公開された日付順に並べられていることであり、カスタムメタフィールドの値ではなく数値です。

    $products = new WP_Query(array(
        'post_type'         => 'wpsc-product',
        'nopaging'          => true,
        'meta_key' => 'release_date_year',
        'each_connected' => array(
            'post_type' => 'artists',
            'nopaging'  => true,
        ),
        'suppress_filters' => false,
        'orderby' => 'meta_value_num',
        'order' => 'asc',
    ));

次に、どのクエリが実行されているのかを調べました。その結果は次のとおりです。

SELECT   wp_posts.* FROM wp_posts  INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1  AND wp_posts.post_type = 'wpsc-product' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND wp_postmeta.meta_key = 'release_date_year' GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order, wp_posts.post_date DESC           

今それは私だけなのでしょうか、それとも私のクエリの 'ORDER BY'部分にはwp_postmeta.meta_keyが含まれているはずですか?私には見えますので、メニュー順、そして投稿日の降順になっています。もう一つの奇妙なことは私も投稿が昇順ではなく降順になっているのを見ているということです。

私が言ったように、私は次のコードを使用してWordpress 3.1を使用しているので私も私のWP_Queryクエリでmeta_queryを使用しようとしました、そしてそれはまだpost_dateによってポストを順序付けていました:

$products = new WP_Query(array(
    'post_type'         => 'wpsc-product',
    'nopaging'          => true,
    'meta_key' => 'release_date_year',
    'meta_query' => array(array(
        'key'  => 'release_date_year',
        'type' => 'NUMERIC'
    )),
    'each_connected' => array(
        'post_type' => 'artists',
        'nopaging'  => true,
    ),
    'suppress_filters' => false,
    'orderby' => 'meta_value',
    'order' => 'desc',
));

WP_Queryステートメントのフォーマットを誤っていますか?それとも、ここで他に何か問題がありますか? wp_postmetaテーブルにデータがあり、そこに各製品の値があることも確認しました。


アップデートと解決策

いくつかのめちゃくちゃの後、私は犯人を見つけた。 'Post Types Order'と呼ばれるプラグインが私のWordpressのクエリを修正していたため、suppress_filters引数が完全に無視されていました。それはorderbyのようなものです。

下記の私の答えを見てください。

1

プラグイン 'Post Types Order'が原因でした。 Scribuが上で指摘したように、プラグインはそれがするべきではないRaw SQLクエリをフィルタリングしています。その結果、引数 'suppress_filters'によって、クエリの変更が停止されず、 'orderby'引数が完全に削除されました。無視されます。

この振る舞いをどのように止めることができるかに関しては、よくわかりません。プラグインは使用されていないため、プラグインを無効にすることで問題を解決しました。ただし、代わりにregister_post_typesコードでカスタム投稿タイプメニューの順序を設定できます。メニューを配置する場所を決定する 'menu_position'引数を使用します。

Wordpressの管理者メニューであなたの投稿タイプを注文するための文書は公式のWordpress文書の中でここに 見つけることができます

ここで学んだ教訓は、特に公式のドキュメンテーションのコードを使っている場合には、プラグインが何かを壊したと常に仮定するべきであるということです。

2

あなたの 'orderby'パラメータは完全に無視されているようです。

'suppress_filters' => trueを設定して干渉がないことを確認してください。

1
scribu