WordPress : 特定条件のユーザーの機能を制限する

例えば「アバター画像が未登録のユーザー」のみの投稿を制限するなど、「投稿者」「編集者」といった権限グループ単位ではなく「ユーザー単位」かつ「特定条件」において機能を制限する方法を紹介します。

前提

要件例

冒頭にもありますが、今回は以下の要件を例とします。

  • 目的: 共同投稿者全員にアバター画像を登録してほしい
  • 対象: 「投稿者」権限かつアバター画像が未登録のユーザー
  • 処理: アバター画像が登録されていなければ、投稿できないようにする

プラグイン

プラグイン「WP User Avatar」を利用します。

WordPress標準アバターの「Gravatar」は利用方法が面倒なので、WP User Avatarで管理画面からユーザーが簡単にアバター画像をアップロードできるようにします。

WP User Avatarを使うことでデータベースのユーザーメタ情報に wp_user_avatar という値が加わります。

この値の有無でコントロールする処理になります。

functions.php の編集

以下のように functions.php に追記します。

if (current_user_can('author')) {
    //ログイン中ユーザーのデータ取得
    global $current_user;
    get_currentuserinfo();

    //WP User Avatar の値取得
    $wp_user_avatar = get_user_meta($current_user -> ID, 'wp_user_avatar', true);
    if(!$wp_user_avatar){

      //管理画面左メニューから「投稿」削除
      function admin_menu_remove_post () {
        global $menu;
        unset($menu[5]); //「投稿」メニュー
      }
      add_action('admin_menu', 'admin_menu_remove_post');

      //ログイン時上部管理メニューから「新規」削除
      function admin_bar_remove_post( $wp_admin_bar ) {
        $wp_admin_bar->remove_node('new-content');
      }
      add_action( 'admin_bar_menu', 'admin_bar_remove_post', 1000 );
    }
}

処理を列挙すると以下になります。

  1. ログイン中のユーザーが「投稿者」かの判断
  2. 投稿者であればログイン中ユーザーのデータ取得
  3. ログイン中ユーザーデータから wp_user_avatar を取得
  4. wp_user_avatarが空(false)なら投稿機能を制限する

解説

まず一行目の以下。

if (current_user_can('author'))

このif文で投稿者ユーザーのみを対象にしています。管理者など他のユーザーは影響を受けません。

3,4行目の以下。

global $current_user;
get_currentuserinfo();

$current_userへログインしているユーザー自身のメタデータが格納されます。 プラグインによって拡張されたメタデータもすべて引っこ抜けます。

7,8行目の以下。

$wp_user_avatar = get_user_meta($current_user -> ID, 'wp_user_avatar', true);
if(!$wp_user_avatar){

$current_userに格納されている、WP User Avatarの値 wp_user_avatar を取り出しています。そしてwp_user_avatarの値が無い場合=アバター画像が未登録の場合のif文に続けています。

このif文以降の内容は、管理画面の左メニューと、ログイン時の上部管理メニューのアクションフックにかけて、投稿リンクを出さないようにしています。

まとめ

ログインユーザーの条件」でコントロールしたい時は $current_user のメタデータを参照します。

プロフィール設定や最終ログイン日なども取得できるので、様々な条件でカスタマイズできます。