サポート » 使い方全般 » 2つの特定カテゴリに年別アーカイブを表示させたい

  • 解決済 235durham

    (@235durham)


    いつもお世話になっております。
    進歩がなくて大変恐縮なのですが、以下、ご存知の方がいらっしゃいましたら、ご回答をいただけないでしょうか?何卒よろしくお願い申し上げます。
    ——————–
    2つの特定カテゴリの一覧ページ(category-52.php)と(category-53.php)に、そのカテゴリでの年別アーカイブのリスト(2009年│2008年│2007年│…)を表示したいと思っています。
    もちろん、その「2007年」をクリックすると、そのカテゴリ内での2007年の投稿が一覧表示されるようにしたいのです。

    「2007年」をクリックした先のURLは、当フォーラムでの過去の質問「特定のカテゴリーだけの月別アーカイブを表示させるには?」にあったようなデフォルトのURL(例: http://www.example.com/?cat=53&m=2007 )になっても構いません。

    ちなみに現在、http://letsusewordpress.com/archives/234などを参考に「Archive for a category」プラグインをインストールして、「category-53.php」に
    <?php wp_get_archives('cat=53&type=yearly&after=年'); ?>
    と書いたところ、
    ・2009年
    ・2008年
     …
    などとは表示はされますが、「2008」年をクリックしても、2008年に投稿した全てのカテゴリの投稿が読み出されてしまいます(そのときのURLは http://www.example.com/?m=2008 となります)。
    ※なぜか、2009年だけは、「http://www.example.com/?m=2009&cat=53」と絞り込まれた意図通りの結果が出てきますが…。(最新のページだから?)

    なお、「日付アーカイブでの特定カテゴリのみの表示」にあったようにarchive.phpにカテゴリを指定する方法は、年別アーカイブを表示させたいカテゴリが2つあるため、
    archive.php側で絞り込むことはできないように思います。

    以上、不勉強で誠に恐縮ではございますが、2つの特定カテゴリのリストページに、そのカテゴリのみの年別アーカイブを表示する方法をご存知の方がおられましたら、何卒お助けくださいますよう、よろしくお願い申し上げます。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • テーマフォルダに category.php を作成して以下を記述すれば OK。

    <?php
    function my_year_link($url, $year){
      global $wp_rewrite;
      $yearlink = $wp_rewrite->get_year_permastruct();
      if(empty($yearlink))
        return $url . '&cat=' . get_query_var('cat');
    
      return $url;
    }
    function my_getarchives_where($where, $r){
      return $where .
        " AND t.taxonomy = 'category' AND terms.term_id = ".get_query_var('cat');
    }
    function my_getarchives_join($join, $r){
      global $wpdb;
      return
        " LEFT JOIN $wpdb->term_relationships as r ON $wpdb->posts.ID = r.object_ID
          LEFT JOIN $wpdb->term_taxonomy as t ON r.term_taxonomy_id = t.term_taxonomy_id
          LEFT JOIN $wpdb->terms as terms ON t.term_id = terms.term_id";
    }
    add_filter('year_link', 'my_year_link', 10, 2);
    add_filter('getarchives_where', 'my_getarchives_where', 10, 2);
    add_filter('getarchives_join', 'my_getarchives_join', 10, 2);
    get_header(); ?>
    <div id="content" class="widecolumn">
      <ul>
        <?php
        if(is_year()) :
          while(have_posts()) :
            the_post();
    	?><li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li><?php
          endwhile;
        else:
          wp_get_archives('type=yearly');
        endif;
        ?>
      </ul>
    </div>
    <?php get_footer();
    remove_filter('year_link', 'my_year_link', 10, 2);
    remove_filter('getarchives_where', 'my_getarchives_where', 10, 2);
    remove_filter('getarchives_join', 'my_getarchives_join', 10, 2);
    ?>

    カテゴリ52と53だけこの形式で他のカテゴリは通常の index.php(または 別途ご用意の category.php) で良いなら
    以下のようにします。
    1.archives-by-category.php を作成して上記コードを記述。
    2.category.php を作成して以下を記述。

    <?php
    $post = $wp_query->post;
    if(in_category('52') || in_category('53'){
     include(TEMPLATEPATH . '/archives-by-category.php');
    }else{
     include(TEMPLATEPATH . '/index.php'); // or category.php
    }
    ?>

    訂正)

    別途ご用意の category.php

    別途ご用意の your-category.php

    // or category.php

    // or your-category.php

    kzさま
    いつも本当にありがとうございます。今回も教えていただいた方法を参考にしたところ、意図通りの表示が実現できました。少しカスタマイズしたので、フォーラムのために方法を記しておきます。

    【変更手順】
    もともとカテゴリ52と53はそれ以外のカテゴリとは別のデザインレイアウトにしていたため、category-52.phpとcategory-53.phpを作成し、それ以外のカテゴリはcategory.phpを読み込ませていた。kzさんの方法をとるため、

    1. category.phpをyour-category.phpにファイル名変更

    2. category.phpを新規作成し、次のコードを記述。

    <?php
    $post = $wp_query->post;
    if(in_category('52')){
     include(TEMPLATEPATH . '/archives-by-category52.php');
    }elseif(in_category('53')){
    	include(TEMPLATEPATH . '/archives-by-category53.php');
    }else{
     include(TEMPLATEPATH . '/your-category.php');
    }
    ?>

    カテゴリ52と53のファイルを分けない場合は、kzさんの教えてくださったコードでok。
    ただし、3行目の
    if(in_category('52') || in_category('53'){
    は、
    if(in_category('52') || in_category('53')){
    にする。

    3. category-52.phpをarchives-by-category52.phpに、category-53.phpをarchives-by-category53.phpに名称変更する
    それぞれファイルの一番上に、kzさんの教えてくださったコードの「…get_header(); ?>」までを記述。

    <?php
    function my_year_link($url, $year){
      global $wp_rewrite;
      $yearlink = $wp_rewrite->get_year_permastruct();
      if(empty($yearlink))
        return $url . '&cat=' . get_query_var('cat');
    
      return $url;
    }
    function my_getarchives_where($where, $r){
      return $where .
        " AND t.taxonomy = 'category' AND terms.term_id = ".get_query_var('cat');
    }
    function my_getarchives_join($join, $r){
      global $wpdb;
      return
        " LEFT JOIN $wpdb->term_relationships as r ON $wpdb->posts.ID = r.object_ID
          LEFT JOIN $wpdb->term_taxonomy as t ON r.term_taxonomy_id = t.term_taxonomy_id
          LEFT JOIN $wpdb->terms as terms ON t.term_id = terms.term_id";
    }
    add_filter('year_link', 'my_year_link', 10, 2);
    add_filter('getarchives_where', 'my_getarchives_where', 10, 2);
    add_filter('getarchives_join', 'my_getarchives_join', 10, 2);
    get_header(); ?>

    4. archives-by-category52.phpとarchives-by-category53.phpそれぞれに、年別アーカイブを置きたい所に次のコードを入れる

    <div id="yearlyarchive">
    <ul>
    <?php wp_get_archives('type=yearly&after=年'); ?>
    </ul>
    </div>

    5. archives-by-category52.phpとarchives-by-category53.phpそれぞれの最後に、kzさんの教えてくださったコードの途中から(下記)を入れる

    <?php get_footer();
    remove_filter('year_link', 'my_year_link', 10, 2);
    remove_filter('getarchives_where', 'my_getarchives_where', 10, 2);
    remove_filter('getarchives_join', 'my_getarchives_join', 10, 2);
    ?>

    説明が長くなりましたが、以上の方法で実現できました。
    方法はこれで正しいのかはわかりませんが、私の環境では作動しています。
    kzさん、誠にありがとうございました。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「2つの特定カテゴリに年別アーカイブを表示させたい」には新たに返信することはできません。