WordPressログイン通知をChatwork・Slack・メールへ送信する統合プラグインの作成方法

WordPressの管理体制を強化したい方におすすめなのが、「誰が・いつログインしたか」を即時に把握できる通知機能です。
今回は、Chatwork / Slack / メールの3種類に対応した統合ログイン通知プラグインを自作する方法をご紹介します。

すべてのソースコードを掲載していますので、functions.php ではなく独立したプラグインとして利用したい方にも最適です。


機能の概要

このプラグインは以下の機能を提供します:

  • ユーザーがログインした際にChatwork・Slack・メールに通知を送信
  • 通知内容は、ユーザー名 / 権限 / ログイン時刻 / IPアドレス / サイト名
  • 通知先やON/OFFは管理画面から設定可能
  • 各通知手段は個別に有効/無効を切り替え可能

プラグイン構成

multi-login-notifier/
├── multi-login-notifier.php       ← プラグイン本体
└── includes/
    └── settings.php               ← 設定画面UI

この multi-login-notifier フォルダをそのまま wp-content/plugins/ に配置し、有効化するだけで使用できます。


1. プラグイン本体:multi-login-notifier.php

<?php
/**
 * Plugin Name: Multi Login Notifier
 * Description: Chatwork・Slack・メールにログイン通知を送信するWordPressプラグイン
 * Version: 1.0.0
 * Author: Your Name
 */

defined('ABSPATH') || exit;

require_once plugin_dir_path(__FILE__) . 'includes/settings.php';

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

function mln_notify_on_login($user_login, $user) {
    $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 (get_option('mln_chatwork_enabled') === '1') {
        $token = get_option('mln_chatwork_token');
        $room  = get_option('mln_chatwork_room_id');
        if ($token && $room) {
            wp_remote_post("https://api.chatwork.com/v2/rooms/{$room}/messages", [
                'headers' => ['X-ChatWorkToken' => $token],
                'body'    => ['body' => $chatwork_message],
            ]);
        }
    }

    // --- Slack 通知 ---
    if (get_option('mln_slack_enabled') === '1') {
        $webhook = get_option('mln_slack_webhook_url');
        if ($webhook) {
            wp_remote_post($webhook, [
                'headers' => ['Content-Type' => 'application/json'],
                'body'    => json_encode(['text' => $slack_message]),
            ]);
        }
    }

    // --- メール通知 ---
    if (get_option('mln_email_enabled') === '1') {
        $email_to = get_option('mln_email_to');
        if ($email_to) {
            $subject = "[{$site_name}] ログイン通知: {$user_login}";
            wp_mail($email_to, $subject, $plain_message);
        }
    }
}

2. 設定画面:includes/settings.php

<?php
defined('ABSPATH') || exit;

// メニュー追加
add_action('admin_menu', function () {
    add_menu_page(
        'ログイン通知設定',
        'ログイン通知',
        'manage_options',
        'multi-login-notifier',
        'mln_settings_page',
        'dashicons-admin-network',
        83
    );
});

// オプション登録
add_action('admin_init', function () {
    register_setting('mln_settings_group', 'mln_chatwork_enabled');
    register_setting('mln_settings_group', 'mln_chatwork_token');
    register_setting('mln_settings_group', 'mln_chatwork_room_id');

    register_setting('mln_settings_group', 'mln_slack_enabled');
    register_setting('mln_settings_group', 'mln_slack_webhook_url');

    register_setting('mln_settings_group', 'mln_email_enabled');
    register_setting('mln_settings_group', 'mln_email_to');
});

// 設定ページ
function mln_settings_page() {
    ?>
    <div class="wrap">
        <h1>ログイン通知 設定</h1>
        <form method="post" action="options.php">
            <?php settings_fields('mln_settings_group'); ?>
            <table class="form-table">

                <tr><th colspan="2"><h2>Chatwork 通知</h2></th></tr>
                <tr>
                    <th>有効化</th>
                    <td><input type="checkbox" name="mln_chatwork_enabled" value="1" <?php checked(get_option('mln_chatwork_enabled'), '1'); ?> /></td>
                </tr>
                <tr>
                    <th>APIトークン</th>
                    <td><input type="text" name="mln_chatwork_token" value="<?php echo esc_attr(get_option('mln_chatwork_token')); ?>" class="regular-text" /></td>
                </tr>
                <tr>
                    <th>ルームID</th>
                    <td><input type="text" name="mln_chatwork_room_id" value="<?php echo esc_attr(get_option('mln_chatwork_room_id')); ?>" class="regular-text" /></td>
                </tr>

                <tr><th colspan="2"><h2>Slack 通知</h2></th></tr>
                <tr>
                    <th>有効化</th>
                    <td><input type="checkbox" name="mln_slack_enabled" value="1" <?php checked(get_option('mln_slack_enabled'), '1'); ?> /></td>
                </tr>
                <tr>
                    <th>Webhook URL</th>
                    <td><input type="text" name="mln_slack_webhook_url" value="<?php echo esc_attr(get_option('mln_slack_webhook_url')); ?>" class="regular-text" /></td>
                </tr>

                <tr><th colspan="2"><h2>メール通知</h2></th></tr>
                <tr>
                    <th>有効化</th>
                    <td><input type="checkbox" name="mln_email_enabled" value="1" <?php checked(get_option('mln_email_enabled'), '1'); ?> /></td>
                </tr>
                <tr>
                    <th>送信先メールアドレス</th>
                    <td><input type="email" name="mln_email_to" value="<?php echo esc_attr(get_option('mln_email_to')); ?>" class="regular-text" /></td>
                </tr>

            </table>
            <?php submit_button(); ?>
        </form>
    </div>
    <?php
}

導入手順

  1. 上記コードを multi-login-notifier フォルダに格納
  2. フォルダごと wp-content/plugins/ に配置
  3. WordPress管理画面から「Multi Login Notifier」を有効化
  4. 左メニュー「ログイン通知」から各通知方法を設定

まとめ

このプラグインを導入することで、WordPressログインの監視をChatwork・Slack・メールのいずれかまたはすべてで実現できます。
運用体制やチームの使用ツールにあわせて柔軟に対応でき、セキュリティと可視性の向上に大きく貢献します。

コメント

タイトルとURLをコピーしました