南国スキーぶろぐ・Z

岩手県盛岡市のネタを中心としたお出掛け雑記ブログ

当サイトはアフィリエイト広告を利用しております

岩手県と盛岡市のブログです

functionsでWordPressの管理画面をカスタマイズしまくる備忘録

にほんブログ村 地域生活(街) 東北ブログ 岩手県情報へ にほんブログ村 地域生活(街) 東北ブログ 盛岡市情報へ

2018/01/18

Web, wordpress

移行前の旧ブログでもサクッとまとめた結果、1万PV以上を超える人気記事となったWordPressのfunctions.phpを使った管理画面カスタマイズ。webのお仕事をしていて改めて必要性を強く感じたので、改めてまとめてみました。

WP Admin UI Customizeと言うプラグインを使えば簡単に出来るんですが、このプラグインはひとつの権限しかカスタマイズ出来ません(有償版なら複数権限をカスタマイズ出来るらしい)。でも、先日お仕事で作成したサイトでは、編集者権限1ユーザー、投稿者ユーザー20ユーザーを用意する必要があったんです。そーゆー訳で、functions.phpでの管理画面カスタマイズが必要になったのです。

なお、上の写真はこの記事の内容とは一切関係ありません。

ユーザー権限で条件分岐

そのままfunctionsに書くと、管理者権限でログインした時にも反映されちゃうので、条件分岐で反映されるユーザー権限を指定します。今回は投稿者(author)でログインした時に反映されるように条件分岐させます。

if (current_user_can('author')) {

// ここに内容を記述

}

ちなみに他の権限は以下のとおり。

  • 管理者(administrator)
  • 編集者(editor)
  • 投稿者(author)
  • 寄稿者(contributor)
  • 購読者(subscriber)

管理画面上部の管理バーのカスタマイズ

不要な項目を非表示にする

管理バーに表示されている更新情報、コメント、新規追加などの項目を非表示にします。管理バー右側に表示されているアカウント情報はパスワードの変更などが出来てしまうので非表示にします。

function my_wp_before_admin_bar_render() {
   global $wp_admin_bar;
   $wp_admin_bar->remove_menu('wp-logo');  // wordpressロゴ
   $wp_admin_bar->remove_menu('updates');  // 更新
   $wp_admin_bar->remove_menu('comments');  // コメント
   $wp_admin_bar->remove_menu('new-content');  // 新規
   $wp_admin_bar->remove_menu('my-account');  // マイアカウント
   $wp_admin_bar->remove_menu('user-info');  // マイアカウント内「プロフィール」
   $wp_admin_bar->remove_menu('edit-profile');  // マイアカウント内「プロフィールを編集」
   $wp_admin_bar->remove_node( 'user-actions' );

}
add_action( 'wp_before_admin_bar_render', 'my_wp_before_admin_bar_render' );

全てを消してしまうと、ログアウトが出来なくなってしまったり、現在ログインしているユーザー名も分からなくなってしまうので、それらは次の項目で追加します。

管理バーにログアウトを追加する

右上のアカウントを消すとログアウトボタンも消えてしまします。言うまでもなく困るので、左上に追加します。

function add_new_item_in_admin_bar() {
  global $wp_admin_bar;
  $wp_admin_bar->add_menu(array(
    'id' => 'new_item_in_admin_bar',
    'title' => __('ログアウト'),
    'href' => wp_logout_url()
  ));
}
add_action('wp_before_admin_bar_render', 'add_new_item_in_admin_bar');

管理バーにユーザー名を追加する

誰がログインしているか分からないのも困るので、右上にログインユーザー名を表示させ、ユーザー名をクリックしても新しいパスワードの再発行が出来るプロフィール画面に飛ばないようにリンクを消します。

function my_admin_bar_custom() {
    global $wp_admin_bar;
 	$user_id = get_current_user_id();
	$current_user = wp_get_current_user();
	$url = get_admin_url();
	if ( ! $user_id )
		return;
	$wp_admin_bar->add_menu(array(
	'id'        => 'my-account-custom',
	'parent'    => 'top-secondary',
	'title'     => $current_user->display_name . 'さん',
	'href'      => false //ここでリンクを消す
	));
 }
add_action('wp_before_admin_bar_render', 'my_admin_bar_custom');

ダッシュボードの項目を非表示にする

ログイン後に表示されるダッシュボードから不要な項目を非表示にします。全部消すのもなんなんで、概要は表示させておこうかな。

function example_remove_dashboard_widgets() {
  global $wp_meta_boxes;
  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']);   // 現在の状況(概要)
  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']);   // 最近のコメント
  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']);   // 被リンク
  unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);   // プラグイン
  unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']);   // クイック投稿
  unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);   // 最近の下書き
  unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);   // WordPressブログ
  unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);   // WordPressフォーラム
}
add_action('wp_dashboard_setup', 'example_remove_dashboard_widgets');

表示オプションとヘルプ

出てても良いけど、下手に弄られて「表示がおかしくなった」とかの問合せが来るのが面倒くさいので、いつも非表示にしています。

function my_admin_head(){
 echo '<style type="text/css">#contextual-help-link-wrap{display:none;}</style>';
 echo '<style type="text/css">#screen-options-link-wrap{display:none;}</style>';
}
add_action('admin_head', 'my_admin_head');

サイドバーメニューの非表示設定

一番大事な所。記事を書くだけの投稿者や寄稿者には、本当に必要最低限だけのメニューを表示させたい。でも、デフォルトだとイマイチ痒い所に手が届いていない。と言う訳で必須カスタマイズ。

実際に表示されているメニュー名を追加していくだけで、プラグインによって追加されたメニューも非表示に出来ます。

function remove_menus () {
      global $menu;
      $restricted = array(__('リンク'), __('固定ページ'), __('コメント'), __('外観'), __('プラグイン'), __('ユーザー'), __('ツール'), __('設定'), __('ユーザー管理'), __('設定'), __('お問い合わせ'), __('プロフィール')); //ココに削除したい項目の表示名をそのまま記述
      end ($menu);
      while (prev($menu)){
         $value = explode(' ',$menu[key($menu)][0]);
         if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
      }
   }
add_action('admin_menu', 'remove_menus');

自分がアップロードした画像のみをメディアに表示させる

投稿者や寄稿者などのユーザーが複数名居る場合、投稿一覧には自分が投稿した記事のみが表示されますが、メディアライブラリには全ての画像が表示されてしまいます。それだと間違って消されたりする可能性があるので、そのユーザーがアップロードしたメディアのみをライブラリーに表示されるようにします。

function display_only_self_uploaded_medias( $query ) {
  if ( $user = wp_get_current_user() ) {
    $query['author'] = $user->ID;
  }
  return $query;
}
add_action( 'ajax_query_attachments_args', 'display_only_self_uploaded_medias' );

投稿画面からカテゴリーとタグを非表示にする

カテゴリーはともかく、タグをお客さんに使ってもらうことは殆ど無いので非表示します。表示オプションで消すのも良いですが、functionsに書くことによって元から消せるなら消しちゃいましょう。

function my_unregister_taxonomies() {
  global $wp_taxonomies;

  /*** カテゴリーを非表示 ***/
  if (!empty($wp_taxonomies['category']->object_type)) {
    foreach ($wp_taxonomies['category']->object_type as $i => $object_type) {
      if ($object_type == 'post') { unset($wp_taxonomies['category']->object_type[$i]); }
    }
  }

  /*** タグを非表示 ***/
  if (!empty($wp_taxonomies['post_tag']->object_type)) {
    foreach ($wp_taxonomies['post_tag']->object_type as $i => $object_type) {
      if ($object_type == 'post') { unset($wp_taxonomies['post_tag']->object_type[$i]); }
    }
  }
  return true;
} 
add_action('init', 'my_unregister_taxonomies');

サイドバーの投稿を別な名前にする

サイドバーの投稿ですが、お客さんによって「Informartion」だったり「What’s New」だったりします。投稿でも良いのですが、カスタム投稿などで投稿が増えた場合に紛らわしいので変えれるなら変えちゃいましょう。

function custom_post_labels( $labels ) {
  $labels->name = 'Information'; // 投稿
  $labels->singular_name = 'Information'; // 投稿
  $labels->add_new = '新規追加'; // 新規追加
  $labels->add_new_item = 'Informationを追加'; // 新規投稿を追加
  $labels->edit_item = '編集'; // 投稿の編集
  $labels->new_item = '新規投稿'; // 新規投稿
  $labels->view_item = 'Informationを表示'; // 投稿を表示
  $labels->search_items = 'Informationを検索'; // 投稿を検索
  $labels->not_found = '見つかりませんでした。'; // 投稿が見つかりませんでした。
  $labels->not_found_in_trash = 'ゴミ箱内に見つかりませんでした。'; // ゴミ箱内に投稿が見つかりませんでした。
  $labels->parent_item_colon = ''; // (なし)
  $labels->all_items = 'Information一覧'; // 投稿一覧
  $labels->archives = 'Informationアーカイブ'; // 投稿アーカイブ
  $labels->insert_into_item = 'Informationに挿入'; // 投稿に挿入
  $labels->uploaded_to_this_item = 'このInformationへのアップロード'; // この投稿へのアップロード
  $labels->featured_image = 'アイキャッチ画像'; // アイキャッチ画像
  $labels->set_featured_image = 'アイキャッチ画像を設定'; // アイキャッチ画像を設定
  $labels->remove_featured_image = 'アイキャッチ画像を削除'; // アイキャッチ画像を削除
  $labels->use_featured_image = 'アイキャッチ画像として使用'; // アイキャッチ画像として使用
  $labels->filter_items_list = 'Informationリストの絞り込み'; // 投稿リストの絞り込み
  $labels->items_list_navigation = 'Informationリストナビゲーション'; // 投稿リストナビゲーション
  $labels->items_list = 'Informationリスト'; // 投稿リスト
  $labels->menu_name = 'Information'; // 投稿
  $labels->name_admin_bar = 'Information'; // 投稿
  return $labels;
}
add_filter( 'post_type_labels_post', 'custom_post_labels' );

WordPressは奥が深すぎる…

と言う訳で、functions.phpで管理画面をカスタマイズする備忘録でした。こんなのスラスラ書けないっす(笑)。

WordPressって「こう言うの出来ないかなー」って思いつくと大概出来るんですよね。場合によってはプラグイン化までされてたりします。俺は兼務でWebも担当してるんですが、正直、Google先生と、無償で便利なコードやプラグインを公開してくれている勇者によって支えられています(笑)。

世の中のWordPressでサイト制作をしているクリエイター達はどーしてるんでしょうか。やはりスラスラ自分で書いちゃうんでしょうか?

WordPressでサイトを作成するに当たって、PHPとJavaScriptは必須です。これらを自分で自作出来るような人が本当のWeb屋さんなんでしょうね。それに合わせてデザインセンスとphotoshopにIllustratorなどのスキルも必要。Web単価ってもっと高くても良いような気がします。