久々にWordPressを触ったときに、WordPress標準の「投稿」(post_type が post のやつ)のラベルを変更するのってどうだったっけ?と思って調べたら、「init
のアクションフック仕掛けてラベル無理やり書き換えようぜー。でもそれだけだと管理画面のメニューは書き換わらないからそれはadmin_menu
のアクションフックを別に仕掛けようぜー」って記事(と、そのコピーブログが大量に)でてきて、いくらなんでも乱暴すぎだろ。と思ったのでメモ。
結論
register_post_type_args
のフィルターフックを使ったほうがきっと良い。
なぜ前述の方法が乱暴だと思うのか
別に、前述の方法でも悪くはない。とは思っている。
プログラムなんて思ったように認識できる範囲で動いていればそれでよいだろうし。
ただ、なぜ乱暴と思ったかというと、例えば「投稿」から「ブログ」に書き換えたいと思ったとき、initアクションフックを使ったときやっていることはすでに登録されているラベルの情報をあとから書き換えておこう。という考え方なので、その処理より前に実行されたり、そもそもその情報使ってない処理については書き換えが実行されないので、別途書き換える必要がある。
それが、「管理画面のメニュー」というわかりやすい形で現れてくる。
なので、思ったようにプログラムを動かすために別途フックを仕掛けて、次はメニューを書き換えている。
その場合「ブログ」と変更した名前を「お知らせ」に変えたいと思ったとき、複数箇所書き換える必要が出てきてしまうので、どちらかの処理を忘れるとそれだけでおかしなことになってしまう。
そんなやり方は効率的ではないというか、力技だよね?というはなし。
で、どうすんの?
基本的には結論の通り。 register_post_type_args
を使おう。
このフックが何かというと、投稿タイプを作成するときに呼び出されるWP_PostType
クラスのset_props
メソッドの中にあるもので、投稿タイプの登録で使用するregister_post_type
に渡す$args
の内容をフィルターできるフックになっている。
2つの引数を受け取ることができて、1つ目はregister_post_typeで渡された$args。2つ目は投稿タイプのslugになっている。
使用例
使い方としてはこんな感じになる。
function change_post_labels( $args, $post_type ) {
if ( $post_type !== 'post' ) {
return $args;
}
$args['labels']['name'] = 'お知らせ';
return $args;
}
add_filter( 'register_post_type_args', 'change_post_labels', 10, 2 );
例では、$args['labels']['name']
しか書き換えていないので、管理画面での検索結果などには反映されないけど、基本的に register_post_type
で渡すlabels
を設定することが出来るので、細かく対応するのであれば以下のようになる。
function change_post_labels($args, $post_type)
{
if ($post_type !== 'post') {
return $args;
}
$args['labels'] = [
'name' => 'お知らせ',
'singular_name' => 'お知らせ',
'add_new' => '新規お知らせ',
'add_new_item' => '新しいお知らせを追加',
'edit_item' => 'お知らせを編集',
// ... このあと色々続く
];
return $args;
}
add_filter('register_post_type_args', 'change_post_labels', 10, 2);
きりが無いのでやめた。ラベルの内容については公式のget_post_type_labels()
を参考に。
なぜこの方法のほうが良いのか
「投稿」という投稿タイプを登録する前にラベルを変更するので、その後の処理において必ず反映されるからおそらく変更漏れというのがない。
何度もフックを仕掛ける必要が無いのでスマートじゃないかと思う。
まとめ
人によってはこっちの方法のほうが乱暴じゃないかと思う人もいるかも知れないけど(根本を変えているから)プログラム的にはこっちのほうがスマートじゃないかなと思うので参考までに。
もっとスマートな方法があるよ!とか、この方法だとこんな問題を抱えているよとかあったら教えて下さい。
おわり。