ユーザーのカスタムフィールドの値でダッシュボードウィジェットの表示を変える

MTQに以下のような質問がありました。

ダッシュボードウィジェットを、ユーザーのカスタムフィールド(チェックボックス)のチェックのあり・なしによって表示・非表示を切り替えたいと思っています。

この質問に答えます。

1.ユーザーの情報を得る

ダッシュボードウィジェットのテンプレートの中で、ユーザーの情報を得るには、MTAuthorsタグでユーザーの情報をすべて読み込んだ上で、現在ログイン中のユーザーかどうかを調べるようにします。
また、現在ログイン中ユーザーのIDは、変数author_idに代入されています。

なお、MTAuthorsタグでユーザーを読み込む際には、「need_entry="0"」と「role="ロール名"」のモディファイアを指定して、ブログ記事がないユーザーも含み、かつ特定のロールを持つユーザーを読み込むようにします。

たとえば、「ブログ管理者」か「ライター」か「ユーザー」のロールがあるユーザーを読み込み、その中で現在ログイン中のユーザーだけ何かを表示するようにするには、テンプレートに以下のような部分を入れます。

<mt:Authors need_entry="0" role="ブログ管理者 OR ライター OR ユーザー">
  <mt:If tag="AuthorID" eq="$author_id">
    表示する内容
  </mt:If>
</mt:Authors>

2.特定のユーザーだけダッシュボードウィジェットを追加できるようにする

1.で挙げた方法を使うと、ユーザーに応じてダッシュボードウィジェットの表示内容を変えることはできます。
ただ、今のままだと、ダッシュボードウィジェットを選択するドロップダウンで、どのユーザーでもダッシュボードウィジェットを追加することができます。
特定のユーザーだけダッシュボードウィジェットを追加できるようにしたいとなると、1.だけでは不十分です。

ダッシュボードウィジェットを追加できるかどうかを指定するには、テンプレートではなく、config.yamlにPerlのコードを書く必要があります。
質問の例では、チェックボックスのカスタムフィールドのオン/オフで、表示するかどうかを変えたいということでした。
この場合、config.yamlの「widgets:」以下を以下のように書きます。
「カスタムフィールドのベースネーム」の部分は、実際のベースネームに置き換えます。

widgets:
  ウィジェット名:
    label: ウィジェットの名前
    (途中略)
    condition: >
      sub {
        use CustomFields::Util qw( get_meta );
        my $app = MT->instance;
        my $author = $app->user;
        my $meta = get_meta($author);
        return $meta->{カスタムフィールドのベースネーム};
      }

3.関連記事

ダッシュボードウィジェットの作り方は、以下の記事をご参照ください。