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');
});
使い方
- 上記コードを
functions.phpに追記 $new_emailを変更先のアドレスに書き換え- サイトにアクセス(管理画面でもフロントでもOK)
- 動作確認後、コードを
functions.phpから削除

コメント