• 解決済 petitsabi

    (@petitsabi)


    「africa」というカスタム投稿タイプを作成しました。
    日別および年別アーカイブページを表示させるため、date.php を作成しました。が、date.php ではなく、優先順位では下位にあるはずの archive.php が表示されてしまいます。

    試しに archive.php を削除してみると、date.php が表示されます。

    プラグイン Custom Post Type Permalinks を使っています。パーマリンク設定を更新してみましたが、変わりませんでした。

    記憶違いでなければ、以前は date.php が表示されていました。wordpress のアップグレードのせいかもと疑いましたが、わかりませんでした。
    解決のヒントをいただけましたら助かります。

    テーマ:Twenty Ten をカスタマイズ
    カスタム投稿名:「アフリカ」「africa」
    最新記事ページ:example.net/africa ←archive.php表示
    日別ページ:example.net/2014/12/22?post_type=africa ←date.php があるのに、archive.php表示
    年別ページ:example.net/africa/date/2013?post_type=africa ←date.php があるのに、archive.php表示

    functions.php

    add_action( 'init', 'create_post_type' );
    function create_post_type() {
      register_post_type( 'africa',
    		array(
    		'labels' => array(
    			'name' => _x('アフリカ', 'post type general name'),
    			'singular_name' => _x('アフリカ', 'post type singular name'),
    			'add_new' => _x('新しく記事を書く', 'africa'),
    			'add_new_item' => __('アフリカの記事を書く'),
    			'edit_item' => __('アフリカの記事を編集'),
    			'new_item' => __('新しいアフリカの記事'),
    			'view_item' => __('記事を見る'),
    			'search_items' => __('アフリカの記事を探す'),
    			'not_found' =>  __('アフリカの記事はありません'),
    			'not_found_in_trash' => __('ゴミ箱にアフリカの記事はありません'),
    			'parent_item_colon' => ''
    		),
    		'public' => true,
    		'has_archive' => true,
    		'menu_position' => 100,
    		'rewrite' => true,
    		'description' => 'RetirementAustralia'
    		)
    	);
      register_taxonomy(
        'africa_cat', /* タクソノミーの名前 */
        'africa', /* africa投稿で設定する */
        array(
          'hierarchical' => true, /* 親子関係が必要なければ false */
          'update_count_callback' => '_update_post_term_count',
          'label' => 'アフリカカテゴリー',
          'singular_label' => 'アフリカカテゴリー',
          'public' => true,
          'show_ui' => true
        )
      );
    
    /* 年別アーカイブをカスタム投稿タイプ別に表示する */
    global $my_archives_post_type;
    add_filter( 'getarchives_where', 'my_getarchives_where', 10, 2 );
    function my_getarchives_where( $where, $r ) {
      global $my_archives_post_type;
      if ( isset($r['post_type']) ) {
        $my_archives_post_type = $r['post_type'];
        $where = str_replace( '\'post\'', '\'' . $r['post_type'] . '\'', $where );
      } else {
        $my_archives_post_type = '';
      }
      return $where;
    }
    add_filter( 'get_archives_link', 'my_get_archives_link' );
    function my_get_archives_link($link_html) {
        global $my_archives_post_type;
        if ($my_archives_post_type != '') {
            $add_link = '?post_type=' . $my_archives_post_type;
            $link_html = preg_replace("/href=\'(.+)\'/", "href='$1" . $add_link. "'", $link_html);
        }
        return $link_html;
    }

    WordPress のバージョン:4.1
    PHP、MySQL のバージョン:PHP5.4.7 MySQL 5.5.27
    サーバー環境:さくらインターネット

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • petitsabiさん
    3.7以降、カスタム投稿タイプのテンプレートの優先度が上がっているようですね。
    リクエストにpost_typeパラメータがあると、投稿タイプ名が1つの場合は
    archive-{$post_type}.php、その次にarchive.phpを順に検索し、どちらかが
    見つかった場合はそのテンプレートで表示されるようです。
    詳しくは wp-includes/template-loader.php を。

    解決策ですが、実際にテンプレートを読み込む前に’template_include’フィルターが
    呼び出されるので、そのフィルター関数で処理するのが妥当だと思います。

    トピック投稿者 petitsabi

    (@petitsabi)

    tmatsuurさん
    ありがとうございます!早速の的確なアドバイスをいただき、とても助かりました。

    wp-includes/template-loader.php を旧バージョンと比較してみたら、

    elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :

    の行が追加されていました。これが原因でしょうか。

    下記を functions.php に書いてみたところ、希望通り、日別アーカイブに date.php が読み込まれました。

    /* 日別ページのテンプレートファイルは date.php */
    add_filter('template_include', function($template) {
        global $wp_query;
        if($wp_query->is_date() && $wp_query->get('pagename') == '') {
            return get_date_template();
        }
        return $template;
    });
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「date.php があるのに、archive.php が表示されてしまう」には新たに返信することはできません。