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

如何实现WordPress登录与CodeIgniter 3应用的对接?

解决方案建议

核心思路

由于两者部署在同一域名下,Cookie可跨目录共享,核心方向是基于WordPress的登录状态,同步生成CodeIgniter的登录会话,或让CodeIgniter主动验证WordPress的用户登录有效性,实现免二次登录。


方案一:WordPress登录/登出时同步操作CodeIgniter会话

1. 监听WordPress登录事件,同步创建CI登录会话

在WordPress主题的functions.php中添加登录钩子,用户成功登录WP后,自动完成CI端的用户校验/创建及会话初始化:

add_action('wp_login', 'sync_wp_login_to_ci', 10, 2);
function sync_wp_login_to_ci($user_login, $user) {
    // 获取WP用户核心信息
    $wp_user_id = $user->ID;
    $wp_user_email = $user->user_email;
    $wp_username = $user->user_login;

    // 连接CI数据库,校验用户是否存在,不存在则创建
    $ci_db = new mysqli('localhost', 'ci_db_user', 'ci_db_pass', 'ci_db_name');
    if ($ci_db->connect_error) {
        error_log('CI数据库连接失败: ' . $ci_db->connect_error);
        return;
    }

    // 预处理查询避免SQL注入
    $stmt = $ci_db->prepare("SELECT id FROM users WHERE email = ?");
    $stmt->bind_param("s", $wp_user_email);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if ($result->num_rows === 0) {
        $stmt_insert = $ci_db->prepare("INSERT INTO users (username, email, created_at) VALUES (?, ?, NOW())");
        $stmt_insert->bind_param("ss", $wp_username, $wp_user_email);
        $stmt_insert->execute();
        $ci_user_id = $stmt_insert->insert_id;
        $stmt_insert->close();
    } else {
        $row = $result->fetch_assoc();
        $ci_user_id = $row['id'];
    }
    $stmt->close();
    $ci_db->close();

    // 加载CI核心文件,初始化会话并设置登录状态
    require_once $_SERVER['DOCUMENT_ROOT'] . '/app/index.php';
    $CI =& get_instance();
    $CI->load->library('session');
    
    $CI->session->set_userdata([
        'user_id' => $ci_user_id,
        'logged_in' => TRUE,
        'email' => $wp_user_email
    ]);
}

2. 监听WordPress登出事件,同步销毁CI会话

同样在functions.php中添加登出钩子,确保用户退出WP时CI也同步登出:

add_action('wp_logout', 'sync_wp_logout_to_ci');
function sync_wp_logout_to_ci() {
    require_once $_SERVER['DOCUMENT_ROOT'] . '/app/index.php';
    $CI =& get_instance();
    $CI->load->library('session');
    $CI->session->sess_destroy();
}

方案二:CodeIgniter端主动验证WordPress登录状态

若不想修改WP端代码,可让CI在用户访问时自动检查WP登录状态,已登录则自动创建CI会话:

1. 在CI基础控制器中添加验证逻辑

假设CI的基础控制器为MY_Controller.php,在构造方法中加入WP登录校验逻辑:

class MY_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->auto_sync_wp_login();
    }

    private function auto_sync_wp_login() {
        // 若CI已登录,直接跳过
        if ($this->session->userdata('logged_in')) {
            return;
        }

        // 加载WP核心文件,验证用户登录状态
        require_once $_SERVER['DOCUMENT_ROOT'] . '/wordpress/wp-load.php';
        if (!is_user_logged_in()) {
            return;
        }

        $wp_user = wp_get_current_user();
        $wp_user_email = $wp_user->user_email;
        $wp_username = $wp_user->user_login;

        // 校验CI数据库中是否存在用户,不存在则创建
        $this->db->where('email', $wp_user_email);
        $ci_user = $this->db->get('users')->row();

        if (!$ci_user) {
            $user_data = [
                'username' => $wp_username,
                'email' => $wp_user_email,
                'created_at' => date('Y-m-d H:i:s')
            ];
            $this->db->insert('users', $user_data);
            $ci_user_id = $this->db->insert_id();
        } else {
            $ci_user_id = $ci_user->id;
        }

        // 设置CI登录会话
        $this->session->set_userdata([
            'user_id' => $ci_user_id,
            'logged_in' => TRUE,
            'email' => $wp_user_email
        ]);
    }
}

2. 调整CI会话配置,确保跨目录共享

修改CI的application/config/config.php,设置Cookie的域名和路径,保证WP和CI的Cookie可共享:

$config['cookie_domain']    = '.yourdomain.com'; // 替换为实际域名,前面加.实现子目录共享
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE; // 若站点启用HTTPS则设为TRUE
$config['cookie_httponly']  = TRUE;
$config['sess_cookie_name'] = 'ci_session'; // 与WP默认会话名称区分开,避免冲突

关键注意事项

  • SQL注入防护:所有数据库操作务必使用预处理语句,避免直接拼接SQL字符串。
  • 会话冲突规避:确保WP和CI的会话Cookie名称不同,WP默认会话名称为wordpress_logged_in_xxx,CI可自定义避免冲突。
  • 用户数据同步:若需保持WP和CI的用户资料一致,可添加WP的profile_update钩子,同步更新CI数据库中的用户信息。
  • 测试验证:先在测试环境验证登录、登出、会话同步流程,确认无问题后再部署到生产环境。

内容的提问来源于stack exchange,提问作者Harkesh Singh Chauhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:09:13