てくてくあるく

WordPress の テーマ とか プラグイン に ついて 勉強しています

WordPress に デフォルト で 存在する 投稿 の ラベル を 変更する際 良い方法がないものか 考えた結果 良さげな 結論に至ったので 共有したい


最終的な方法 (結論)


add_filter('post_type_labels_post', 'filter_post_type_labels');
function filter_post_type_labels($labels)
{
  foreach ($labels as &$label) {
    $label = str_replace('投稿', __('New Label', 'default'), $label);
  }
  unset($label);
  return $labels;
}

の 様にするのが 一番コンパクトかな と 思う


よく見る global の $wp_post_types $menu $submenu を 書き変える方法


add_action('init', 'filter_post_types');
function filter_post_types()
{
  global $wp_post_types;
  $label = __('New Label', 'default');
  $labels = &$wp_post_types['post']->labels;
  $labels->name = $label;
  $labels->singular_name = $label;
  // labels の 設定分 書き換える
}

add_action('admin_menu', 'filter_menu');
function filter_menu()
{
  global $menu;
  global $submenu;
  $label = __('New Label', 'default');
  $menu[5][0] = $label;
  $submenu['edit.php'][5][0] = __('New Label List', 'default');
  $submenu['edit.php'][10][0] = __('New New Label', 'default');
}

検索すると 大抵 上記の方法が 引っかかるけど 少々 強引かな?? と 思う

できれば 投稿 を 作るタイミング で ラベル名 を 変更する方が スマートに感じる

あと この手の複製記事が多くて 他の手法が なかなか見つけられなくて 困る…


register_post_type_args フィルター を 使う方法


register_post_type_args | Hook | WordPress Developer Resources
https://developer.wordpress.org/reference/hooks/register_post_type_args/

次に register_post_type_args を 使って $args の 中身を書き換える方法

add_action('admin_menu', [$this, 'add_admin_menu']);
function filter_post_type_args($args, $post_type)
{
  if ($post_type === 'post') {
    $args['labels'] = [
      'name' => __('New Label', 'default'),
      'singular_name' => __('New Label', 'default'),
      // labels の 設定分 書き換える
    ];
  }
  return $args;
}

これは 先程の方法よりも だいぶスマートに感じる

ただ ラベルの数だけ 修正しないといけないのは かなり手間だ

array(1) {
  ["name_admin_bar"]=>
  string(4) "Post"
}
array(1) {
  ["name_admin_bar"]=>
  string(6) "投稿"
}

$args['labels'] の 中身も 上記の通りなので 置換では うまく行かない


post_type_labels_{$post_type} フィルター を 使う方法


register_post_type を 調べていたところ 省略したラベルを 補完生成してくれる関数 get_post_type_labels 内に post_type_labels_{$post_type} フィルター を 見つけた

get_post_type_labels() | Function | WordPress Developer Resources
https://developer.wordpress.org/reference/functions/get_post_type_labels/

post_type_labels_{$post_type} | Hook | WordPress Developer Resources
https://developer.wordpress.org/reference/hooks/post_type_labels_post_type/

それで 冒頭のようなコードを 考えついたのだ

post_type_labels_{$post_type} は デフォルト の 投稿 の 場合 翻訳前 と 翻訳後 の 2回走る

翻訳前 の Post / Posts を 置換しても 翻訳後 の 処理 で 上書きされてしまうので '投稿' で 置換している

もっとスマートな方法 や これだと こんな問題が起きます 等 何かあったら コメント下さい

Related Article

Custom Field Suite が 使いやすそう!!

more »

2017/01/06 に Bootstrap 4 Alpha 6 が 来ていました

more »

Bootstrap v5.0.0 に 更新しました!!

more »