WordPress 6.8へのアップデート後、Simple WP Membership(SWPM)プラグインで会員がパスワードを変更すると、新しいパスワードでログインできなくなる問題が発生します。旧パスワードでもログインできなくなるため、会員がロックアウトされる深刻な不具合です。
本記事では、原因の特定から修正方法まで、実際のトラブル対応をもとに解説します。
発生条件
・WordPress 6.8 以降(6.9、6.9.1 含む)
・Simple WP Membership プラグイン 4.x系(4.3.3で確認)
・テーマやカスタムコードで wp_hash_password() を使ってSWPMのパスワードを更新している場合
※ SWPMの標準プロフィール編集機能を使っている場合も、内部で wp_hash_password() を呼んでいれば同様の問題が発生する可能性があります。
症状
- 会員がプロフィール編集画面でパスワードを変更する
- 変更処理は正常に完了する(完了画面が表示される)
- 新しいパスワードでログインしようとすると「パスワードが未記入または無効です。」と表示される
- 変更前のパスワードでもログインできない
- 会員が完全にロックアウトされる
原因
WordPress 6.8のパスワードハッシュ変更
WordPress 6.8で wp_hash_password() 関数の出力が変わりました。
WordPress 6.7以前:
$P$BxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxYY
phpass形式、34文字、$P$ で始まる。
WordPress 6.8以降:
$wp$2y$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
WordPress独自のbcrypt形式、63文字、$wp$2y$10$ で始まる。
SWPMのパスワード照合の問題
SWPMプラグインのログイン処理(SwpmAuth クラス)は、パスワードの照合にWordPressの wp_check_password() ではなく、phpassの PasswordHash クラスを直接使用しています。
// SWPMの内部処理(概念コード)
require_once ABSPATH . 'wp-includes/class-phpass.php';
$wp_hasher = new PasswordHash(8, TRUE);
$wp_hasher->CheckPassword($plain_password, $db_password);
phpassの CheckPassword() は $P$ 形式のハッシュしか認識できません。WordPress 6.8以降の $wp$2y$10$ 形式は認識できないため、パスワードが正しくても照合に失敗します。
なぜ旧パスワードもダメになるのか
パスワード変更時の処理を見ると理解できます:
// よくあるカスタムコードのパターン
$password = wp_hash_password($_POST['password']); // ← ここで $wp$2y$10$ 形式のハッシュが生成される
$wpdb->update('wp_swpm_members_tbl', ['password' => $password], ['member_id' => $id]);
wp_hash_password()が$wp$2y$10$...形式のハッシュを生成- このハッシュがSWPMのテーブルに保存される
- ログイン時、SWPMはphpassで照合しようとするが
$wp$2y$10$を認識できない - 新パスワード → 照合不能で失敗
- 旧パスワード → ハッシュ自体が書き換わっているので当然失敗
確認方法
以下のPHPスクリプトをWordPressのルートディレクトリに一時的に配置して、ハッシュ形式を確認できます。
<?php
// 確認後すぐ削除すること
require_once(dirname(__FILE__) . '/wp-load.php');
header('Content-Type: text/plain; charset=utf-8');
echo "=== wp_hash_password test ===\n";
$hash = wp_hash_password('test');
echo "Hash: " . $hash . "\n";
echo "Length: " . strlen($hash) . "\n";
echo "Starts with \$P\$: " . (strpos($hash, '$P$') === 0 ? 'YES (phpass - OK)' : 'NO') . "\n";
echo "Starts with \$wp\$: " . (strpos($hash, '$wp$') === 0 ? 'YES (bcrypt - SWPMで問題あり)' : 'NO') . "\n";
$wp$ で始まるハッシュが生成される場合、この問題の影響を受けます。
確認後は必ずこのファイルを削除してください。
修正方法
カスタムコードで wp_hash_password() を使っている場合
wp_hash_password() の代わりに、phpassの PasswordHash クラスで直接ハッシュを生成します。
修正前:
$password = wp_hash_password($_POST['password']);
修正後:
require_once ABSPATH . 'wp-includes/class-phpass.php';
$hasher = new PasswordHash(8, TRUE);
$password = $hasher->HashPassword($_POST['password']);
これにより、SWPMが認識できる $P$B... 形式のハッシュが生成されます。
WordPressユーザーテーブルとの同期も忘れずに
SWPMは会員ごとに対応するWordPressユーザーを作成しています。SWPMテーブルだけでなく、WordPressユーザーのパスワードも同期することを推奨します。
// SWPMテーブル更新後に追加
if (!empty($_POST['password'])) {
$wp_user = get_user_by('email', $swpm_user->email);
if ($wp_user) {
wp_set_password($_POST['password'], $wp_user->ID);
}
}
ロックアウトされた会員の復旧
パスワード変更を試みてログインできなくなった会員は、WordPress管理画面から復旧できます。
- WordPress管理画面にログイン
- WP Membership → Members
- 該当会員の「Edit」をクリック
- パスワード欄に新しいパスワードを入力して保存
- 会員に新しいパスワードを連絡
影響範囲
・Simple WP Membership プラグインのアクティブインストール: 50,000以上
・WordPress 6.8以降にアップデートした全てのSWPM利用サイトが潜在的に影響を受ける
・会員がパスワードを変更した時点で顕在化する(変更しなければ既存のphpassハッシュが使われるため問題なし)
根本的な解決
この問題の根本的な解決は、SWPMプラグイン側が wp_check_password() を使うように更新されることです。WordPress の wp_check_password() は $wp$2y$10$ 形式を正しく処理できます。
SWPMの開発チームにこの問題を報告することを推奨します。
技術環境
本記事の検証環境:
・WordPress 6.9
・Simple WP Membership 4.3.3
・PHP 8.3
・Xserver
まとめ
・WordPress 6.8以降で wp_hash_password() の出力形式が変わった
・SWPMのパスワード照合は古いphpass形式にしか対応していない
・wp_hash_password() を直接使わず、phpassの PasswordHash クラスで直接ハッシュすることで回避可能
・SWPMプラグインのアップデートで根本解決されるまでの暫定対応
WordPress 6.8以降へのアップデートを検討している方、またはアップデート後に会員のログイントラブルが発生している方の参考になれば幸いです。
合同会社panolabo
https://panolabollc.com
会員サイトが壊れて困っている方へ
WordPressの障害復旧を承っています。プラグイン更新後の不具合、会員がログインできない、白画面など。原因の特定から復旧まで対応します。
販売実績58件・評価5.0・出品者ランク プラチナ(2026-09時点)