MTでコメントのメール通知をユーザーごとに切り替える方法

MovableTypeをつかって、複数人で記事を投稿していると、記事に対してコメントがあった場合にメールでの通知をするようにしているのですが、中にはメールでの通知してほしくないという人もいます。
MT設定で、元々切り替え可能なコメントのメール通知は、以下のように全体での設定なので、ユーザーごとに通知を切り替えることはできません。

image-20150723011439.png

そういうメール通知切り替えプラグインとかもあるのかなと思って探してみましたが、見当たりませんでしたので、サイト名のとおり自分でなんとかしてみました。
「コメント通知機能OFF」というカスタムフィールド(ユーザー)を作って、チェックされている場合はメール通知しないように改造しました。

手順は次の通り。
※基本設定はメール通知を「有効にする」状態にしてください。

1. 新たにカスタムフィールド(ユーザー)を作る

システム管理画面より、カスタムフィールドを新規作成する。
以下の画面のように、
システムオブジェクト: ユーザー
名前: コメント通知機能OFF
種類: チェックボックス
必須: NULL
規定値: NULL
ベースネーム: commentsnotification
テンプレートタグ: CommentsNotification

image-20150723012105.png

2. /lib/MT/App.pm を修正する

/lib/MT/App.pm の2455行目あたりにある「sub _send_comment_notification」がコメントがあった際にメールで通知させるスクリプトなので、この箇所をカスタムフィールドで作成した「コメント通知機能OFF」を確認してから処理を実行させるようにする。

以下のように、ハイライト部分を追記する。

sub _send_comment_notification {
    my $app = shift;
    my ( $comment, $comment_link, $entry, $blog, $commenter ) = @_;

    # コメント通知切り替えカスタムフィールド判定
    my $author = $entry->author;
    my %terms = ( author_id => $author->id );
    my $commentsno = MT::Author->search_by_meta('field.commentsnotification','1',\%terms);
    if ( $commentsno != '1' ) {

    return unless $blog->email_new_comments;

    my $cfg       = $app->config;
    my $attn_reqd = $comment->is_moderated;

    if ( $blog->email_attn_reqd_comments && !$attn_reqd ) {
        return;
    }

    require MT::Mail;
    # コメント通知切り替えカスタムフィールド判定で定義しているため、コメントアウト
    # my $author = $entry->author;
    $app->set_language( $author->preferred_language )
        if $author && $author->preferred_language;
    my $from_addr;
    my $reply_to;
    if ( $cfg->EmailReplyTo ) {
        $reply_to = $comment->email;
    }
    else {
        $from_addr = $comment->email;
    }
    $from_addr = undef if $from_addr && !is_valid_email($from_addr);
    $reply_to  = undef if $reply_to  && !is_valid_email($reply_to);
    if ( $author && $author->email )
    {    # } && is_valid_email($author->email)) {
        if ( !$from_addr ) {
            $from_addr = $cfg->EmailAddressMain || $author->email;
            $from_addr = $comment->author . ' <' . $from_addr . '>'
                if $comment->author;
        }
        my %head = (
            id => 'new_comment',
            To => $author->email,
            $from_addr ? ( From       => $from_addr ) : (),
            $reply_to  ? ( 'Reply-To' => $reply_to )  : (),
            Subject => '['
                . $blog->name . '] '
                . $app->translate(
                "New Comment Added to '[_1]'",
                $entry->title
                )
        );
        my $charset = $cfg->MailEncoding || $cfg->PublishCharset;
        $head{'Content-Type'} = qq(text/plain; charset="$charset");
        my $base;
        {
            local $app->{is_admin} = 1;
            $base = $app->base . $app->mt_uri;
        }
        if ( $base =~ m!^/! ) {
            my ($blog_domain) = $blog->site_url =~ m|(.+://[^/]+)|;
            $base = $blog_domain . $base;
        }
        my $nonce
            = MT::Util::perl_sha1_digest_hex( $comment->id
                . $comment->created_on
                . $blog->id
                . $cfg->SecretToken );
        my $approve_link = $base
            . $app->uri_params(
            'mode' => 'approve_item',
            args   => {
                blog_id => $blog->id,
                '_type' => 'comment',
                id      => $comment->id,
                nonce   => $nonce
            }
            );
        my $spam_link = $base
            . $app->uri_params(
            'mode' => 'handle_junk',
            args   => {
                blog_id => $blog->id,
                '_type' => 'comment',
                id      => $comment->id,
                nonce   => $nonce
            }
            );
        my $edit_link = $base
            . $app->uri_params(
            'mode' => 'view',
            args   => {
                blog_id => $blog->id,
                '_type' => 'comment',
                id      => $comment->id
            }
            );
        my $ban_link = $base
            . $app->uri_params(
            'mode' => 'save',
            args   => {
                '_type' => 'banlist',
                blog_id => $blog->id,
                ip      => $comment->ip
            }
            );
        my %param = (
            blog           => $blog,
            entry          => $entry,
            view_url       => $comment_link,
            approve_url    => $approve_link,
            spam_url       => $spam_link,
            edit_url       => $edit_link,
            ban_url        => $ban_link,
            comment        => $comment,
            unapproved     => !$comment->visible(),
            state_editable => (
                $author->is_superuser()
                    || (
                       $author->permissions( $blog->id )->can_manage_feedback
                    || $author->permissions( $blog->id )->can_publish_post )
            ) ? 1 : 0,
        );
        my $body = MT->build_email( 'new-comment.tmpl', \%param );
        MT::Mail->send( \%head, $body )
            or return $app->error( MT::Mail->errstr() );
    }
  }
}

2583行目の } を忘れずに追記してください。
修正したら、ファイルを extlib/MT/App.pm へアップロードしてください。

以上です。
あとは、ユーザー情報ページにて、実際に「コメント通知機能OFF」にチェックを入れてみて、記事にコメントを投稿した際にチェックが入っていたら通知がこないことを確認してください。

ちなみに、MT::ObjectでDBからカスタムフィールド値を呼び出すのに苦労しましたが、以下のサイトでMT::Object->search_by_meta()を使えばいいということを知りました。助かりました。
参考:MT::Object->search_by_meta() でカスタムフィールド以外での検索条件を追加する