追記(2012.04.02)
taxonomy-genre.php の記述を簡略化しました。
WordPressで音楽情報配信のコーナーを作ろうと思いまして、カスタム投稿タイプと、カスタムタクソノミーを作りました。しかし多くの人がつまづくように、僕もタクソノミーのアーカイブページでひっかかりました。最初のページは表示されるのに、2ページ目以降で 404 NotFoundになってしまったのです。
http://~/taxname/term/ ← 表示される
http://~/taxname/term/page/2/ ← 404 NotFound
課題は残ったものの一応原因が判明し、解決もしたのでメモとしてまとめたいと思います。なお、投稿タイプ、タクソノミーについては下記のサイトがとてもわかりやすいです。
参考:WordPressでサイト設計をする時に覚えておきたいポストタイプの特徴などいろいろ
テンプレート設定
まず今回の要件は下記のような感じです。
WordPress 3.3.1
カスタム投稿タイプ:sounds
タクソノミー名:genre
分類名:ロック スラッグ:rock
テンプレート:taxonomy-genre.php
カスタム投稿タイプ、カスタムタクソノミーの作成には当初「Custom Post Type UI」を使用していたのですが、リライトルールを色々試す必要があったので、function.php に直接記述しました。
function.php
長いから非表示にします。クリックすると表示されます。
// カスタム投稿タイプを登録
add_action('init', 'posttype_sounds_init');
function posttype_sounds_init()
{
// カスタム投稿タイプ「sound」
register_post_type(
'sounds',
array(
'label' => '曲',
'description' => '',
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => true,
'query_var' => true,
'has_archive' => true,
'supports' => array(
'title','editor','custom-fields',
'revisions','thumbnail','page-attributes' ),
'labels' => array (
'name' => '曲',
'singular_name' => '',
'menu_name' => '曲',
'add_new' => 'Add 曲',
'add_new_item' => 'Add New 曲',
'edit' => 'Edit',
'edit_item' => 'Edit 曲',
'new_item' => 'New 曲',
'view' => 'View 曲',
'view_item' => 'View 曲',
'search_items' => 'Search 曲',
'not_found' => 'No 曲 Found',
'not_found_in_trash' => 'No 曲 Found in Trash',
'parent' => 'Parent 曲'
)
)
);
}
// カスタムタクソノミーを登録
add_action( 'init', 'taxonomy_genre', 0 );
function taxonomy_genre()
{
register_taxonomy(
'genre',
array (
0 => 'sounds',
),
array(
'hierarchical' => false,
'label' => 'ジャンル',
'show_ui' => true,
'query_var' => true,
'rewrite' => array( true, 'with_front' => false ),
'singular_label' => 'genre',
'public' => true,
'sort' => true,
)
);
}
taxonomy-genre.php
タクソノミー「genre」のアーカイブ用テンプレートです。
こちらも長いから非表示にします。クリックすると表示されます。
<?php
global $wp_query;
$args = array_merge(
$wp_query->query,
array(
'posts_per_page' => 5
)
);
query_posts( $args );
if (have_posts()) :while (have_posts()) :
the_post();
?>
<h1><?php the_title(); ?></h1>
~通常の記事表示~
<?php
endwhile;
endif;
<?php
/*
以下は変更前********************
// ページ数
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// ターム情報
$term = get_term_by( 'name', single_term_title('', false), 'genre' );
// 新着5件取得
query_posts( array(
'post_type' => 'sounds',
'taxonomy' => 'genre',
'term' => $term->slug,
'posts_per_page' => 5,
'paged' => $paged,
'order' => 'DESC'
));
if (have_posts()) :while (have_posts()) :
the_post();
?>
<h1><?php the_title(); ?></h1>
~通常の記事表示~
<?php
endwhile;
endif;
// WP-PageNavi
wp_pagenavi();
// クエリーリセット
wp_reset_query();
*/
?>
症状
上記の設定で1ページ目は表示するのですが、2ページは 404.php が表示されてしまいます。
原因
原因は WordPressの[表示設定>1ページに表示する最大投稿数]でした。
この時の登録件数は【8件】なのですが、表示件数は【5件】、上記設定は【10件】に設定されていました。
つまり、WP-PageNaviは query_posts() で指定した表示件数を元にページ数を計算しているのに、WordPress自体は表示設定の件数を元に計算していたため、「2ページ目は11件目から表示だろ? 無いね。よろしい、ならば404だ」と判断されてしまっていたのです。
表示設定を同じ【5件】に設定したら問題なく表示されました。
現在は下記のサイトを参考に【1件】に設定しています。
参考:WordPressでquery_postsを使ったページ送りでNot Foundになる件 - 主に技術的なことを書くブログ
その他の試行錯誤
タクソノミーアーカイブの 404 NotFoundで検索するとたいていはタクソノミー登録時のリライト設定が出てきます。flush_rewrite_rules() で解決するパターンもあったりと、いろいろなようです。
他にも見落しがちな原因としては、WordPressのパーマリンク設定の更新です。
設定を変更する必要はなく、「変更を保存」ボタンを押すだけです。
参考:ふじこのプログラミング奮闘記
rewrite を hierarchical にしたら治った例。
参考:rewriteをhierarchical
rewrite を 'with_front'=>false にしたら治った例。
参考:404 error - Category page for custom-taxonomy shows 404 when using custom permalink structure - WordPress - Stack Exchange
タクソノミー名に「-(ハイフン)」が入っていたのが原因ぽい例。
参考:WordPress > フォーラム ? カスタムタクソノミーのアーカイブページで404エラー
flush_rewrite_rules() を加えた例。
参考:WordPress基本設定 | HiroDesignヒロデザインWEB制作会社
スラッグがバッティングしたので変更。
参考:WordPressのカスタム投稿タイプの一覧ページでページ送りを利用する | ちいさな創々
カスタム投稿タイプの 404問題を「Custom Post Type Category Pagination Fix」というプラグインで解決。
参考:カスタム投稿タイプでのページ送り(ページネーション)が「404 Not Found」を返すときの対処法 | 鉄王
まとめ
検索してみるとかなりポピュラーなつまづきポイントなのに、コレという解決策がないのがすごいというかなんというか。WordPress奥が深いです。
No comments yet.