You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解密Drupal存储密码至WordPress库?同步改密至WordPress库实现方案

嘿,我来帮你搞定这两个Drupal和WordPress密码同步的问题,分两部分说清楚:

一、如何将Drupal存储的密码同步到WordPress数据库?

首先得明确一个关键:Drupal里的用户密码是单向哈希加密的,根本没法直接解密。Drupal从7版本开始就用加盐的强哈希算法(比如bcrypt),早期WordPress用MD5,现在WP也支持bcrypt了,但两者的哈希格式不通用。所以靠谱的方案有两个:

  • 方案1:引导用户重置密码(推荐)
    直接把Drupal用户的用户名、邮箱导入WordPress,然后给每个用户发密码重置邮件。这是最安全、最省心的方式,完全避免哈希兼容的问题,还能让用户自己设置新密码。

  • 方案2:让WordPress兼容Drupal的哈希格式
    如果必须保留用户现有密码,就得修改WP的密码验证逻辑,让它能识别Drupal的哈希。但这个方法需要定制WP核心或者开发插件,维护成本高,风险也大,除非特殊情况,不建议用。

二、Drupal修改密码后同步到WordPress数据库

你已经用hook_form_alter定位到用户表单了,但原代码里的exit会打断表单提交流程,而且没做实际的同步操作。下面是修改后的完整代码,添加了表单提交处理,能在用户修改密码后自动同步到WP:

/**
 * Implements hook_form_alter().
 */
function YOUR_MODULE_NAME_form_alter(&$form, &$form_state, $form_id) {
    // 匹配用户编辑表单和密码重置表单
    if ($form_id == 'user_profile_form' || $form_id == 'user_pass_reset') {
        // 添加自定义提交处理函数,在默认提交逻辑之后执行
        $form['#submit'][] = 'custom_sync_password_to_wp';
    }
}

/**
 * 自定义提交处理:同步Drupal密码到WordPress数据库
 */
function custom_sync_password_to_wp($form, &$form_state) {
    $drupal_user = $form_state['user'];
    $new_password = $form_state['values']['pass'];

    // 跳过空密码的情况(用户没修改密码时不执行同步)
    if (empty($new_password)) {
        return;
    }

    // --------------------------
    // 替换成你的WordPress数据库信息
    $wp_db_config = [
        'host' => 'localhost',
        'dbname' => 'your_wordpress_db',
        'user' => 'wp_db_username',
        'pass' => 'wp_db_password',
    ];
    // --------------------------

    // 连接WordPress数据库
    $wp_db = mysqli_connect(
        $wp_db_config['host'],
        $wp_db_config['user'],
        $wp_db_config['pass'],
        $wp_db_config['dbname']
    );

    if (!$wp_db) {
        // 用Drupal的日志功能记录连接失败信息(生产环境用这个,别直接输出)
        watchdog('password_sync', 'WP数据库连接失败: @error', ['@error' => mysqli_connect_error()], WATCHDOG_ERROR);
        return;
    }

    // 用WordPress官方推荐的哈希函数生成密码(需要引入WP的pluggable.php)
    // 替换成你的WordPress安装路径
    require_once '/var/www/wordpress/wp-includes/pluggable.php';
    $wp_hashed_password = wp_hash_password($new_password);

    // 这里假设Drupal和WP用户用邮箱匹配,如果是ID匹配就改WHERE条件为 WHERE ID = {$drupal_user->uid}
    $safe_email = mysqli_real_escape_string($wp_db, $drupal_user->mail);
    $update_query = "UPDATE wp_users SET user_pass = '$wp_hashed_password' WHERE user_email = '$safe_email'";

    // 执行更新并记录日志
    if (mysqli_query($wp_db, $update_query)) {
        watchdog('password_sync', '密码同步成功,用户邮箱: @email', ['@email' => $drupal_user->mail], WATCHDOG_INFO);
    } else {
        watchdog('password_sync', '密码同步失败: @error', ['@error' => mysqli_error($wp_db)], WATCHDOG_ERROR);
    }

    // 关闭数据库连接
    mysqli_close($wp_db);
}

几个重要的注意事项:

  1. 把YOUR_MODULE_NAME替换成你实际的Drupal自定义模块名称,代码要放到模块的.module文件里
  2. 确保Drupal服务器能访问WordPress的数据库:开放数据库端口、给WP数据库用户授权远程访问权限
  3. 生产环境绝对不要用print_r和exit,用Drupal的watchdog记录日志才安全
  4. 如果你的WordPress版本比较老,wp_hash_password可能需要额外处理,但现在大部分WP版本都支持这个函数
  5. 要保证Drupal和WP的用户标识一致(比如邮箱、ID),不然会同步错用户

内容的提问来源于stack exchange,提问作者gopi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:32:55