カスタム分類名として使えないキーワード「予約語」には要注意

WordPress個別サポート

WordPressのカスタム投稿タイプにカスタム分類を追加するときは注意が必要です。カスタム分類を追加するregister_taxonomy関数では、使えないキーワード(予約語)があります。

たとえば、posts、cat、year、day、tagなどはカスタム分類名には使えません。

※register_taxonomyの「予約語」について詳しくは、以下のページをご覧ください。

WordPress Codex:register_taxonomy関数

よくあるパターンとしてカスタム投稿タイプ「book」(おすすめの本)などを年度で分類したくなるかもしれませんが、yearというカスタム分類名を付けると非常に面倒な問題が発生します。

このトラブルは実際に西沢直木のIT講座に相談が寄せられ、解決に長い時間がかかってしまいました、、、

みなさんが同じ問題で困らないように、以下、おすすめの本を投稿するためのカスタム投稿タイプ「book」を追加する場面を例にトラブルが発生するまでの流れを紹介します。

まずは問題のないパターンを紹介します。「おすすめの本を投稿したい」という発想でカスタム投稿タイプ「book」を追加します。それには、register_post_type関数を使ってfunctions.phpなどに次のようなコードを記述します。

$labels = array(
'name' => _x('Books', 'post type general name'),
'singular_name' => _x('Book', 'post type singular name'),
'add_new' => _x('Add New', 'book'),
'add_new_item' => __('Add New Book'),
'edit_item' => __('Edit Book'),
'new_item' => __('New Book'),
'view_item' => __('View Book'),
'search_items' => __('Search Books'),
'not_found' =>  __('No books found'),
'not_found_in_trash' => __('No books found in Trash'), 
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true, 
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','author')
);
register_post_type('book',$args);

【参考】WordPress Codex:register_post_type

ダッシュボードにカスタム投稿タイプ「book」が追加されます。

追加されたカスタム投稿タイプ「book」
追加されたカスタム投稿タイプ「book」

本をジャンルで分類しようと考えてカスタム分類「genre」(ジャンル)を追加します。それには、register_taxonomy関数を使ってfunctions.phpなどに次のようなコードを記述します。

$labels = array(
'name' => _x( 'Genres', 'taxonomy general name' ),
'singular_name' => _x( 'Genre', 'taxonomy singular name' ),
'search_items' =>  __( 'Search Genres' ),
'all_items' => __( 'All Genres' ),
'parent_item' => __( 'Parent Genre' ),
'parent_item_colon' => __( 'Parent Genre:' ),
'edit_item' => __( 'Edit Genre' ), 
'update_item' => __( 'Update Genre' ),
'add_new_item' => __( 'Add New Genre' ),
'new_item_name' => __( 'New Genre Name' ),
); 	

register_taxonomy('genre',array('book'), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'genre' ),
));

【参考】WordPress Codex:register_taxonomy

カスタム投稿タイプ、カスタム分類を追加したので、パーマリンクが正しく機能するように「設定」‐「パーマリンク設定」メニューで「変更を保存」ボタンをクリックしておきましょう(パーマリンク設定を変更していなくても)。

ダッシュボードのカスタム投稿タイプbookのカスタム分類genreから本を分類するジャンルを登録できるようになります。

追加されたカスタム分類「genre」
追加されたカスタム分類「genre」

カスタム投稿「book」に記事を追加するときにジャンルを選択できます。

カスタム分類を選択
カスタム分類を選択

投稿した記事は普通に参照できます。

カスタム投稿の表示
カスタム投稿の表示

ここまでは問題ありません。一般的なカスタム投稿タイプの使用例です。

ここからが問題です。

今度は「本を年度で分類したい」という発想でカスタム分類「year」を追加します。これが問題を引き起こします。

前述のカスタム分類「genre」と同じようなコードです。

$labels = array(
'name' => _x( 'Years', 'taxonomy general name' ),
'singular_name' => _x( 'Year', 'taxonomy singular name' ),
'search_items' =>  __( 'Search Years' ),
'all_items' => __( 'All Years' ),
'parent_item' => __( 'Parent Year' ),
'parent_item_colon' => __( 'Parent Year:' ),
'edit_item' => __( 'Edit Year' ), 
'update_item' => __( 'Update Year' ),
'add_new_item' => __( 'Add New Year' ),
'new_item_name' => __( 'New Year Name' ),
); 	

register_taxonomy('year',array('book'), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'year' ),
));

【参考】WordPress Codex:register_taxonomy

カスタム分類を有効にするため、「設定」‐「パーマリンク設定」メニューで「変更を保存」ボタンをクリックします。

話がややこしくなって恐縮ですが、問題は「設定」‐「パーマリンク設定」メニューで「変更を保存」ボタンをクリックした時点で発動します。つまり、このボタンを押し忘れたときは、問題に気づきません。かなり長い時間がたった後にパーマリンクの「変更を保存」ボタンをクリックすると、その直後に問題が発生するため、原因の特定が難しくなります(パーマリンク設定が問題だと思ってしまうため)。

カスタム投稿タイプ「book」にカスタム分類「year」が追加されるので、年度を入力します。

一見、問題が起きているようには見えませんが、実際はWordPressシステムには問題が発生しています。この画面では気づかないだけです(普通は気づきません)。

追加されたカスタム分類「year」
追加されたカスタム分類「year」

カスタム分類「year」を選択します。ここでも、問題が起きていることには気づかないでしょう。

カスタム分類「year」の選択
カスタム分類「year」の選択

カスタム投稿は問題なく表示され、違和感はありません。

カスタム投稿の表示
カスタム投稿の表示

何も問題なく見えますが、事件は固定ページを表示したときに起こります。固定ページの「会社概要」を表示しようとすると、なぜか「テスト記事」が表示されます。

「会社概要」が表示されない
「会社概要」が表示されない

他の固定ページのメニューをクリックしても同じように「テスト記事」が表示されるようになってしまいます。

この時点で、事件が起きていることに気づくでしょう。

原因はカスタム分類「year」です。

カスタム分類を追加する関数register_taxonomyで使ってはいけないキーワード(予約語)の「year」を使ったことが原因です。

問題を解決するには、カスタム分類「year」を「book_year」などに変更します。

・現在(トラブルが発生するコード)
register_taxonomy('year',array('book'), array(
…略…
));

・変更後(問題のないコード)
register_taxonomy('book_year',array('book'), array(
…略…
));

「予約語」は、わかりづらい概念かもしれませんが、少なくとも「カスタム分類名には使えないキーワードがあるので注意」と覚えておきましょう。

カスタム分類のトラブルから学ぶこと

この記事はオチがカスタム分類だとわかっているので大きな問題に思えないかもしれません。

問題は「固定ページが正しく表示されない」という現象から「カスタム分類の予約語が原因だ」と思い付くかどうかです。相当難しいでしょう。普通に考えればパーマリンクの問題か、少し詳しい方は.htaccessの問題かと思います。

そんなワケで、こうしたトラブルの解決には長い時間がかかってしまいますが、このトラブルを実際に解決してみて、改めて学んだことは、

トラブルの原因は修正したファイルにある

という当たり前の大原則です。

固定ページのリンクが機能しない場合、「パーマリンク設定がおかしい?」「.htaccessが更新できていない?」「プラグインがバッティングしているのでは?」「WordPressを再インストールした方が良い?」など、あちこちに原因を求めてしまいますが、基本的に、トラブルが発生する原因の多くは、「修正したファイルに記述したコードがおかしい(エラーがある)」ということです。

いろいろなメニューやプラグインに原因を求める前に、ここまでに修正したファイル(おそらくfunctions.phpでしょう)を見直してみましょう。

修正したファイルに追加したコードを1つずつ取り除き、正しく動作した時点までさかのぼることができれば、その直前に取り除いたコードがトラブルの原因です。その関数などをリファレンスで調べて問題の原因をさらに調査していきましょう。

ただ、そもそもfunctions.phpなどに記述したコードの間違いに気づかない理由は、「エラーメッセージが表示されない」からです。「syntax error」などのエラーメッセージが表示されれば、その時点で対処できますが、より注意が必要なのはエラーメッセージが表示されないエラーです。

一見うまくいっているように見えるコードこそ要注意で、問題が起きていないかチェックが必要です。つまり、

本当のエラーはエラーの顔をしていない

です。

プログラミングで時間がかかるのはコードの打ち込みではなくエラーの除去(デバッグ)です。エラーの顔をしていない(エラーメッセージの表示されない)エラーこそ、注意が必要です。

WordPressでfunctions.phpなどのコードを編集したときは、うまくいっているように見えても入念にチェックしてから先に進みましょう。

WordPressトラブル