WordPressログイン通知をChatwork・Slack・メールに一括送信するシンプルなコード

WordPress
WordPress
B!

WordPressサイトのセキュリティや運用監視の一環として、ユーザーがログインしたタイミングをリアルタイムで把握する仕組みが求められる場面は少なくありません。

今回は、Chatwork・Slack・メールの3種類の通知手段にまとめてログイン通知を送信できる、シンプルかつ直接的なコードをご紹介します。

このコードはプラグイン化せず、functions.php に追加するだけで動作し、通知先はコード内で直接設定できます。


できること

  • ユーザーがログインしたとき、Chatwork / Slack / メールのいずれかまたはすべてに通知
  • 通知内容には以下の情報を含む:
  • サイト名
  • ログインユーザー名
  • ユーザー権限(administrator, editorなど)
  • ログイン日時
  • IPアドレス
  • 各通知方法のON/OFFは $chatwork_enabled 等のフラグで切り替え可能

コードの内容(functions.phpに追加)

以下のコードをテーマまたは子テーマの functions.php に追加するだけで、すぐに動作します。

add_action('wp_login', 'multi_notify_on_login_fixed', 10, 2);

function multi_notify_on_login_fixed($user_login, $user) {
    // 通知先設定(ON/OFFや送信先をここで調整)
    $chatwork_enabled = true;
    $chatwork_token   = 'YOUR_CHATWORK_API_TOKEN';
    $chatwork_room_id = '123456789';

    $slack_enabled     = true;
    $slack_webhook_url = 'https://hooks.slack.com/services/XXXX/YYYY/ZZZZZZZZZZ';

    $email_enabled = true;
    $email_to      = 'admin@example.com';

    // 共通ログイン情報の取得
    $site_name  = get_bloginfo('name');
    $site_url   = home_url();
    $ip_address = $_SERVER['REMOTE_ADDR'];
    $login_time = current_time('mysql');
    $roles      = implode(', ', $user->roles);

    // 通知本文
    $plain_message = <<<EOD
以下のユーザーがログインしました。

■ サイト: {$site_name}
■ URL: {$site_url}
■ ユーザー名: {$user_login}
■ 権限: {$roles}
■ ログイン日時: {$login_time}
■ IPアドレス: {$ip_address}
EOD;

    $slack_message = "*ユーザーログイン通知*\n"
                   . "• サイト: {$site_name} ({$site_url})\n"
                   . "• ユーザー名: `{$user_login}`\n"
                   . "• 権限: `{$roles}`\n"
                   . "• ログイン日時: `{$login_time}`\n"
                   . "• IPアドレス: `{$ip_address}`";

    $chatwork_message = "[info][title]ユーザーログイン通知[/title]"
                      . "■ サイト: {$site_name} ({$site_url})\n"
                      . "■ ユーザー名: {$user_login}\n"
                      . "■ 権限: {$roles}\n"
                      . "■ ログイン日時: {$login_time}\n"
                      . "■ IPアドレス: {$ip_address}"
                      . "[/info]";

    // Chatwork通知
    if ($chatwork_enabled && $chatwork_token && $chatwork_room_id) {
        $chatwork_args = [
            'headers' => ['X-ChatWorkToken' => $chatwork_token],
            'body'    => ['body' => $chatwork_message],
        ];
        $chatwork_url = "https://api.chatwork.com/v2/rooms/{$chatwork_room_id}/messages";
        wp_remote_post($chatwork_url, $chatwork_args);
    }

    // Slack通知
    if ($slack_enabled && $slack_webhook_url) {
        $slack_args = [
            'headers' => ['Content-Type' => 'application/json'],
            'body'    => json_encode(['text' => $slack_message]),
        ];
        wp_remote_post($slack_webhook_url, $slack_args);
    }

    // メール通知
    if ($email_enabled && $email_to) {
        $subject = "[{$site_name}] ログイン通知: {$user_login}";
        wp_mail($email_to, $subject, $plain_message);
    }
}

通知の例

Chatwork

[info][title]ユーザーログイン通知[/title]
■ サイト: Sample Site (https://example.com)
■ ユーザー名: admin
■ 権限: administrator
■ ログイン日時: 2025-06-04 02:10:00
■ IPアドレス: 123.123.123.123
[/info]

Slack

ユーザーログイン通知
* サイト: Sample Site (https://example.com)
* ユーザー名: admin
* 権限: administrator
* ログイン日時: 2025-06-04 02:10:00
* IPアドレス: 123.123.123.123

メール

以下のユーザーがログインしました。

■ サイト: Sample Site
■ URL: https://example.com
■ ユーザー名: admin
■ 権限: administrator
■ ログイン日時: 2025-06-04 02:10:00
■ IPアドレス: 123.123.123.123

カスタマイズ例

  • ChatworkまたはSlackだけ通知を使いたい → $xxx_enabled = false;
  • 管理者ユーザーのみ通知対象にしたい → if (in_array('administrator', $user->roles)) を条件に追加
  • 通知メッセージにブラウザ情報やリファラ情報を含めることも可能

まとめ

このコードは、WordPressのログイン通知をChatwork・Slack・メールにまとめて送信できる簡易な仕組みです。
functions.phpに追加するだけで動作するため、プラグインを使わずに素早く導入したい場面に最適です。

運用が安定してきた段階で、管理画面から通知設定を切り替えられるように拡張したり、プラグイン化するのも良いアプローチです。

B!
← 一覧へ戻る