WordPressユーザー・管理者メールアドレスをfunctions.phpから強制変更する方法

WordPress管理画面にアクセスできない、または複数環境で一括変更したい場合に、functions.php からユーザーのメールアドレスと管理者メールアドレスを強制的に変更する方法を解説します。

目次

問題: wp_update_user() ではメールアドレスが即反映されない

WordPress 4.9以降、wp_update_user() でメールアドレスを変更すると確認メール待ちの状態になり、即座には反映されません。

// これだけではメールアドレスが変わらない
wp_update_user([
    'ID'         => $user->ID,
    'user_email' => 'new@example.com',
]);

解決: $wpdb->update() で直接DB更新

$wpdb->update()wp_users テーブルを直接更新し、clean_user_cache() でキャッシュをクリアします。

global $wpdb;
$wpdb->update(
    $wpdb->users,
    ['user_email' => $new_email],
    ['ID' => $user->ID]
);
clean_user_cache($user->ID);

管理者メールアドレス(設定 > 一般)の変更

update_option() で変更し、delete_option('new_admin_email') で確認メールのステップをスキップします。

update_option('admin_email', $new_email);
delete_option('new_admin_email');

一度だけ実行するパターン

オプションテーブルにフラグを立てるのではなく、メールアドレスが既に変更済みかどうかをチェックします。変更後はスキップされるため、コード削除を忘れても副作用がありません。

$user = get_user_by('login', 'admin');
if (!$user || $user->user_email === $new_email) {
    return; // 変更済みならスキップ
}

完成コード

add_action('init', function() {
    $new_email = 'new-email@example.com'; // 変更先のメールアドレス

    $user = get_user_by('login', 'admin');
    if (!$user || $user->user_email === $new_email) {
        return;
    }

    // ユーザーのメールアドレスを直接DB更新
    global $wpdb;
    $wpdb->update(
        $wpdb->users,
        ['user_email' => $new_email],
        ['ID' => $user->ID]
    );
    clean_user_cache($user->ID);

    // 設定 > 一般 > 管理者メールアドレスを変更
    update_option('admin_email', $new_email);
    delete_option('new_admin_email');
});

使い方

  1. 上記コードを functions.php に追記
  2. $new_email を変更先のアドレスに書き換え
  3. サイトにアクセス(管理画面でもフロントでもOK)
  4. 動作確認後、コードを functions.php から削除
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次