web-dev-qa-db-ja.com

Archives.phpを1つのカテゴリだけにするにはどうすればいいですか?

基本的なarchives.phpファイルがあります。カテゴリ1の投稿のみを表示するようにしました。query_posts( 'cat = 1')を実行すると、URLは無視され、カテゴリ1のすべての投稿が表示されます。

たとえば、カテゴリ1に1つの投稿があるとします。これは「テスト用投稿」と呼ばれ、2012年11月1日付けのものです。

現在のarchives.php(cat 1のクエリ投稿を使用)では、URL: http://testing.com/2012/04 は表示されるように解決されます。カテゴリー1内のすべての投稿。投稿は11月の日付であり、URLは4月(04)を照会しているため、ダメです。

Archives.phpは http://testing.com/2012/04http:// testingを解決します.com/2012/11 それぞれの月に投稿があるので(カテゴリー1からではないにしても)、解決しません http:/ /testing.com/2012/09 その月の投稿はありません(カテゴリ1またはそれ以外)

今月のarchives.phpファイルクエリ(URLに含まれるものは何でも)に対して、カテゴリ1の投稿のみを表示するにはどうすればよいですか。別の言い方をすると、どうやって http://testing.com/2012/04 というメッセージが表示されたら「投稿はありません」と表示される、 http://testing.com/2012/09 のように、 http://testing.com/のように2012/11 はまだカテゴリ1からの1つの投稿を表示しますか?

1
Kegan Quimby

まず、query_posts()を使わないでください。

次に、特定のカテゴリのカテゴリアーカイブインデックスページテンプレートを作成するには、 テンプレート階層のCodexエントリ を参照してください。

  • category-{slug}.php
  • category-{id}.php
  • category.php
  • archive.php
  • index.php

したがって、カテゴリIDが'foobar'のカテゴリ1がある場合は、次のいずれかを実行できます。

  • category-foobar.php
  • category-1.php

そしてWordPressはそのテンプレートを使ってそのカテゴリのアーカイブインデックスページをレンダリングします。

ただし、クエリが制限されるのは、テンプレートファイルとは無関係です。 query_posts()を使ってデフォルトのクエリを完全に上書きしているからです。

特定のカテゴリで日付ベースのアーカイブをフィルタするには、代わりに pre_get_posts を使用します。

function wpse75668_filter_pre_get_posts( $query ) {
    // Only modify the main loop query
    // on the front end
    if ( $query->is_main_query() && ! is_admin() ) {
        // Only modify date-based archives
        if ( is_date() ) {
            // Only display posts from category ID 1
            $query->set( 'cat', '1' );
        }
    }
}
add_action( 'pre_get_posts', 'wpse75668_filter_pre_get_posts' );

詳細については、NacinのWordCampによるプレゼンテーション不明なクエリを参照してください。

3
Chip Bennett