水たまりは希望を写している

既存の記事は間違い!? WordPress の「投稿」や「タグ」の表記を変えるベストプラクティス

「投稿」「タグ」「カテゴリー」の表記が変わった WordPress ダッシュボードのスクリーンショットと、「投稿、タグ、カテゴリ、表記を変更」というテキスト。

WordPress に疎い相手に WordPress サイトを納品する際は、「投稿」とか「タグ」という表記を変えたい……という場合がある。「お知らせ」とか「ブログ」とかそういった表記にしたいということだ。

適当にインターネットで調べると、以下のようなコードを functions.php に追記すれば良いと紹介しているサイトがたくさん出てくる。

function change_post_menu_label() {
 	global $menu;
 	global $submenu;
 	$menu[5][0] = 'お知らせ';
 	$submenu['edit.php'][5][0] = 'お知らせ一覧';
 	$submenu['edit.php'][10][0] = '新しいお知らせ';
 	$submenu['edit.php'][16][0] = 'タグ';
 }
 add_action( 'admin_menu', 'change_post_menu_label' );
   
 function change_post_object_label() {
 	global $wp_post_types;
 	$labels = &$wp_post_types['post']->labels;
 	$labels->name = 'お知らせ';
 	$labels->singular_name = 'お知らせ';
 	$labels->add_new = 'お知らせを追加';
 	(中略)
 }
 add_action( 'init', 'change_post_object_label' );

単刀直入にいうと、この書き方はダメだ

むやみなメニュー表記の変更はエラーを生む

一番何がダメかというと、7 行目の $submenu['edit.php'][16][0] = 'タグ'; だ。グローバル変数 $submenu の名前に相当する部分を書き換えてメニュー名の名称を実現しているのだが、エラーを引き起こすコードになっている。

なぜなら、このメニューの ['edit.php'][16]必ず要素があるかどうか限らないからである。

WordPress にはユーザー権限があり、投稿者以下の権限を持つユーザーは、「タグ」メニューがない。そのため、直接 ['edit.php'][16] の中身を変更しようとすると、本来はなかった ['edit.php'][16] が追加されてしまう。

エラーが出ている WordPress ダッシュボードのスクリーンショット。

管理画面を表示する際、WordPress は ['edit.php'][16] 内の他の要素もあることを前提に HTML を生成するので、[0] 以外の要素にアクセスしてしまうことになる。

PHP 8 以降、この動作は Warning を吐くようになるのでダッシュボードがエラーまみれになってしまう。

正しく変更するには? : 投稿タイプからまるまる変更する

まず「投稿」を異なる表記にするには、デフォルトの投稿タイプのラベルを変更する。

function change_post_object_label() {
 	$post_type = get_post_type_object( 'post' );
 	$post_type->label = 'お知らせ';
 	$labels = $post_type->labels;
 	$labels->name = 'お知らせ';
 	$labels->name_admin_bar = 'お知らせ';
 	$labels->singular_name = 'お知らせ';
 	$labels->add_new = 'お知らせを追加';
 	$labels->add_new_item = 'お知らせの新規追加';
 	$labels->edit_item = 'お知らせの編集';
 	$labels->new_item = '新規お知らせ';
 	$labels->view_item = 'お知らせを表示';
 	$labels->view_items = 'お知らせを表示';
 	$labels->search_items = 'お知らせを検索';
 	$labels->not_found = 'お知らせが見つかりませんでした';
 	$labels->not_found_in_trash = 'ゴミ箱にお知らせは見つかりませんでした';
 	$labels->all_items = 'お知らせ一覧';
 	$labels->archives = 'お知らせのアーカイブ';
 	$labels->attributes = 'お知らせの属性';
 	$labels->insert_into_item = 'お知らせに挿入';
 	$labels->uploaded_to_this_item = 'このお知らせにアップロード';
 	$labels->featured_image = '上部に表示する画像';
 	$labels->set_featured_image = '上部に表示する画像を設定';
 	$labels->remove_featured_image = '上部に表示する画像を削除';
 	$labels->use_featured_image = '上部に表示する画像として使用';
 	$labels->menu_name = 'お知らせ';
 	$labels->filter_items_list = 'お知らせリストのフィルタ';
 	$labels->items_list_navigation = 'お知らせリストナビゲーション';
 	$labels->items_list = 'お知らせリスト';
 	$labels->item_published = 'お知らせを投稿しました。';
 	$labels->item_published_privately = 'お知らせを非公開で投稿しました。';
 	$labels->item_reverted_to_draft = 'お知らせを下書きへ戻しました。';
 	$labels->item_trashed = 'お知らせをごみ箱へ移動しました。';
 	$labels->item_scheduled = 'お知らせを予約投稿しました。';
 	$labels->item_updated = 'お知らせを更新しました。';
 	$labels->item_link = 'お知らせへのリンク';
 	$labels->item_link_description = 'お知らせへのリンク。';
	}
	add_action( 'init', 'change_post_object_label' );

「投稿」を「お知らせ」に変えると想定すると、こんなコードになる。まあ、どれがどうなるかはなんとなく分かると思うので割愛する。これ以外にも変えられるラベルはあるのだが、そもそもデフォルトの投稿タイプだと使われないものや変更の必要がないものもある。詳しくは WordPress 公式ドキュメントを参考。

そして、「タグ」と「カテゴリー」の表記を変更するには、以下のようにする。以下のサンプルコードでは、「タグ」を「キーワード」に、「カテゴリー」を「ジャンル」に変更している。

function change_tag_object_label() {
 	$taxonomy = get_taxonomy( 'post_tag' );
 	$taxonomy->label = 'キーワード';
 	$labels = $taxonomy->labels;
 	$labels->name = 'キーワード';
 	$labels->singular_name = 'キーワード';
 	$labels->search_items = 'キーワードを検索';
 	$labels->popular_items = '人気のキーワード';
 	$labels->all_items = 'すべてのキーワード';
 	$labels->name_field_description = 'サイトに表示されるキーワード名';
 	$labels->edit_item = 'キーワードの編集';
 	$labels->view_item = 'キーワードを表示';
 	$labels->update_item = 'キーワードを更新';
 	$labels->add_new_item = 'キーワードの新規追加';
 	$labels->new_item_name = '新しいキーワード';
 	$labels->separate_items_with_commas = 'キーワードが複数ある場合はカンマで区切って入力して下さい';
 	$labels->add_or_remove_items = 'キーワードを追加または削除';
 	$labels->choose_from_most_used = 'よく使われるキーワードから選択';
 	$labels->not_found = 'キーワードが見つかりませんでした';
 	$labels->no_terms = 'キーワードがありません';
 	$labels->menu_name = 'キーワード';
 	$labels->items_list_navigation = 'キーワードリストナビゲーション';
 	$labels->items_list = 'キーワードリスト';
 	$labels->back_to_items = '← キーワードへ戻る';
 	$labels->item_link = 'キーワードへのリンク';
 	$labels->item_link_description = 'キーワードへのリンク。';
 }
 add_action( 'init', 'change_tag_object_label' );
 
 function change_category_object_label() {
 	$taxonomy = get_taxonomy( 'category' );
 	$taxonomy->label = 'ジャンル';
 	$labels = $taxonomy->labels;
 	$labels->name = 'ジャンル';
 	$labels->singular_name = 'ジャンル';
 	$labels->search_items = 'ジャンルを検索';
 	$labels->all_items = 'すべてのジャンル';
 	$labels->parent_item = '親ジャンル';
 	$labels->parent_item_colon = '親ジャンル:';
 	$labels->name_field_description = 'サイトに表示されるジャンル名';
 	$labels->parent_field_description = 'キーワードとは異なり、ジャンルは階層構造を持つことができます。たとえば、ジャズというジャンルの下にビバップやビッグバンドという子ジャンルを作る、といったようなことです。これはオプションです。';
 	$labels->edit_item = 'ジャンルの編集';
 	$labels->view_item = 'ジャンルを表示';
 	$labels->update_item = 'ジャンルを更新';
 	$labels->add_new_item = 'ジャンルの新規追加';
 	$labels->new_item_name = '新しいジャンル';
 	$labels->not_found = 'ジャンルが見つかりませんでした';
 	$labels->no_terms = 'ジャンルがありません';
 	$labels->menu_name = 'ジャンル';
 	$labels->filter_by_item = 'ジャンルでフィルタ';
 	$labels->items_list_navigation = 'ジャンルリストナビゲーション';
 	$labels->items_list = 'ジャンルリスト';
 	$labels->back_to_items = '← ジャンルへ戻る';
 	$labels->item_link = 'ジャンルへのリンク';
 	$labels->item_link_description = 'ジャンルへのリンク。';
 }
 add_action( 'init', 'change_category_object_label' );

こちらもほかに変えられるラベルがあるが、詳しくは WordPress のドキュメントを参考。逆に menu_name はドキュメントに載ってないし、parent_field_description は不思議なことにカテゴリーだと使用しない作りになっている (他のタクソノミーには適用される) ので設定する意味がない。

エラーがなくなり、「投稿」「タグ」「カテゴリー」の表記が正しく変更された WordPress ダッシュボードのスクリーンショット。

ここまで設定すると、このように「投稿」「タグ」「カテゴリー」の表記が変わる。これが正しい変え方だ。

WordPress は、結構検索上位に出てくるコードが正しくなかったり情報が古かったりするので、是正のために (?) 発信していきたいところ。