サポート » 使い方全般 » pre_get_postsでカスタムフィールドをソートした後、公開日降順で並び替えを

  • 解決済 neikonu

    (@neikonu)


    こんばんわ。はじめて投稿いたします。
    Wordpressの初心者ですが、WP4.0をカスタマイズをしております。

    カスタム投稿タイプの投稿一覧が表示されるアーカイブページを
    pre_get_postsでカスタムフィールドをソートした後、
    公開日降順で並び替えをしたいと考えております。

    フォーラムやサイトを調べて
    下記の記述を試したのですが、日付順になりません。

    function change_posts_per_page($query) {
        if ( is_admin() || ! $query->is_main_query() )
            return;
    
        if ( $query->is_post_type_archive( 'music' ) ) {
    		$query->set( 'orderby', 'meta_value' );
                    $query->set( 'meta_key', 'new' );
    		$query->set( 'orderby', 'date' );
    		$query->set( 'order', 'DESC' );
        }
    }
    add_action( 'pre_get_posts', 'change_posts_per_page' );

    カスタム投稿タイプは「music」で、
    プラグインのCustom Post Type UIで作成しています。

    カスタムフィールドはプラグインのAdvanced Custome Fieldsで作成して、
    フィールド名「new」の値でソートしたいと考えております。

    「new」のフィールドはチェックボックスで
    これにチェックが入っている物と入っていない物で分けた後、
    入っている物の降順、入っていない物の降順で表示されるアーカイブページをしたいのですが、
    pre_get_postsで出来るものなのでしょうか。

    よろしくお願い致します。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • ORDER BY 句で複数のフィールドを指定するときは、スペースで区切ります。

    $query->set('meta_key', 'new');
    $query->set('orderby', 'meta_value date');
    $query->set('order', 'DESC');

    または、配列を指定します。

    $query->set('meta_key', 'new');
    $query->set('orderby', array('meta_value' => 'ASC', 'date' => 'DESC'));

    詳しくは、Scott Taylor さんの A more powerful ORDER BY in WordPress 4.0 を参照してください。

    ただし、これではお望みの形式にはできないかもしれません。

    これにチェックが入っている物と入っていない物で分けた後、
    入っている物の降順、入っていない物の降順で表示される

    これがちょっとはっきりしないのですが、グルーピングをしたい、と解釈すると、GROUP BY 句が必要になります。こちらは、pre_get_posts フックでは無理なので、別にフィルタを指定しないといけません。

    トピック投稿者 neikonu

    (@neikonu)

    kjmtshさん

    お早い返信誠にありがとうございます。
    ご指南頂いた内容で試した所、無事できました。
    誠にありがとうございます。

    複数指定、自分でも行ったと思っていたのですが、
    順番が間違っていたのでしょうか。
    望んだ結果がでず四苦八苦しておりました。

    ありがとうございます!

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「pre_get_postsでカスタムフィールドをソートした後、公開日降順で並び替えを」には新たに返信することはできません。