web-dev-qa-db-ja.com

クエリをカスタマイズ可能にする必要がある場合は、category.phpとThe Loopを使用する必要がありますか?

カテゴリを表示するときに、投稿をソートしてフィルタできるようにする必要があります。カテゴリページを作成する正しい方法は、category( - {id}/{slug})。phpを使用することですが、それを使用すると自動的にループが作成されるので、投稿を並べ替える方法に関係なく別のループ.

その場合は、category( - {id}/{slug})という名前のないファイルを作成する必要がありますが、それをカテゴリにリンクするか、2つのループが作成されていることを無視してください。そのうちの一つは使用されません?

また、その場合はループを再度使用していますが、クエリを変更したほうがget_posts()よりも効率的ですか。

6
Nadroev

はい、クエリをカスタマイズしたい場合でも、ループと特定のカテゴリテンプレートを使用する必要があります。なぜ?:

  1. カスタムページでも、メインクエリは実行されます。そのため、カスタムページでは、メインのクエリを実際に避けているのではなく、別のクエリで置き換えるだけです。

  2. メインクエリ自体はカスタマイズ可能です。

  3. デフォルトのWordPressの振る舞いから逸脱すると、将来保守するのが難しくなります。特に、将来他の誰かがあなたの仕事を引き継ぐのであれば、他の開発者にとっては難しいでしょう。

メインクエリを変更する方法:

幸いなことに、WordPressは非常にカスタマイズ可能です。つまり、メインクエリ(ループ)もカスタマイズ可能です。 pre_get_posts actionフックまたは query_posts() 関数を使用してメインクエリを変更することができます。ただし、pre_get_postsフックを使用することをお勧めします。

たとえば、日付の昇順に基づいてカテゴリ内の投稿の順序を変更するとします。そのためには、テーマのfunctions.phpファイルで次のコードを使用します。

add_action( 'pre_get_posts', 'wpse258109_customize_category_query' );
function wpse258109_customize_category_query( $query ) {
    if( ! is_admin() && $query->is_main_query()  && $query->is_category( 'your-category-slug' ) ) {
        // get the orderby value from where ever you want and set in the main query
        $query->set( 'orderby', array( 'date' => 'ASC' ) );
    }
}

このCODEはメインクエリのデフォルトの振る舞いを変更し、あなたのyour-category-slugアーカイブページへのカテゴリ投稿は昇順でロードされます。もちろん、 WP_Query クラスを使用したカスタムクエリと同様に、このメインクエリにも変更を加えることができます。

5
Fayaz

まず第一に:無駄なクエリについて考えているのは素晴らしいことです。 :)

2番目に、WPは、あなたが何をしていようとも、常にメインクエリーを実行します。しかしあなたができることはそれを無視して二次ループを作成する代わりにこの問い合わせを変更することです。これは pre get posts フックを使って行うことができます。

2
kraftner