如何实现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
相关产品推荐
相关产品推荐

