我必须在我的CodeIgniter系统中添加一个WordPress安装,所以我把它放在一个名为blog
的子图中,并在.htaccess
中除了该文件夹。一切都很好。
我已将所有WordPress表与我的CodeIgniter数据库放在一起,前缀为_wp
。
我现在已经将WordPress博客头文件加载到CodeIgniter的index.php
中,就像这样;
require('blog/wp-blog-header.php');
add_filter('site_url', 'ci_site_url', 1);
function ci_site_url() {
include(FCPATH.'/application/config/config.php');
return $config['base_url'];
}
在我的Account
控制器中创建了一个注册方法,以便与我的Customers
建立实际链接。我这样做是因为我想让WordPress登录/注册过时,并且只能从CodeIgniter登录页面控制它;
protected function register_wp($email_address = FALSE) {
if ($email_address !== FALSE) {
if (username_exists( $email_address ) == NULL) {
$password = wp_generate_password(12, TRUE);
$user_id = wp_create_user($email_address, $password, $email_address);
wp_update_user(array(
'ID' => $user_id,
'nickname' => $email_address
));
$user = new WP_User($user_id);
$user->set_role('subscriber');
$login_data = array(
'user_id' => $user_id,
'password' => $password,
);
return $login_data;
}
else {
// User already exists with that email address
return FALSE;
}
}
else {
// No email_address given
return FALSE;
}
}
登录方法,给出一个想法;
protected function login_wp($user_id = FALSE) {
if ($user_id !== FALSE) {
$user_login = 'admin';
$user = get_userdatabylogin($user_login);
$user_id = $user->ID;
wp_set_current_user($user_id, $user_login);
wp_set_auth_cookie($user_id);
do_action('wp_login', $user_login);
}
else {
// No user_id given
return FALSE;
}
}
一切进展顺利。但是这里发生了冲突;我非常难过,因为到目前为止一切都很顺利:
WordPress取代会话并杀死CodeIgniter的会话。
我已经尝试了很多东西;
session_rename('PHPSESSIDWP');
然后在加载WordPress后为CodeIgniter启动另一个会话(使用其他名称)问题是我无法仅在控制器方法中加载require('blog/wp-blog-header.php');
,因为我需要能够控制WordPress部分的登录状态。除此之外,我会收到关于site_url()
函数的投诉,这已经被URL帮助者声明了。
我认为问题主要是因为CodeIgniter和WordPress都使用他们自己独特的方式来处理Sessions(数据库中的CI和“超级全局”中的WordPress),这可能只会让他们使用cookie来记住“状态”。
我的整个CodeIgniter系统已经在数据库驱动的会话模型上运行,因此绝对不能进行切换。对于WordPress来说,似乎它甚至不能再与会话一起使用它的代码功能(我知道会话“做”工作,但这对WP核心系统似乎没有任何影响。)
此外,我在wp_unregister_GLOBALS();
文件中引用wp-settings.php
。
此外,我还尝试在CodeIgniter中重命名我的会话COOKIE名称以使用类似session_ci
我真的希望有人知道能够告诉CodeIgniter或WordPress只更新其值并且不会每次都杀死整个会话的方法。我还读到了一些关于使用.htaccess
拆分cookie的内容,但找不到好的资源。所以,如果有人知道如何做到这一点,我会永远感激。
我绝望了。完成它98%,然后最终得到这样的失望:( ..
的更新 的
也许我可以在处理Cookie的WordPress部分做些什么?
http://codex.wordpress.org/Function_Reference/wp_set_auth_cookie
可悲的是,我并不是WordPress世界的家。由于购买了人们真正想在博客中使用的模板,我一次只能使用它。
另外this页面说明了以下内容;
WordPress使用这两个cookie来绕过wp-login.php的密码输入部分。如果WordPress识别出您有有效的,未过期的cookie,则直接转到WordPress管理界面。如果您没有Cookie,或者它们已过期,或以其他方式无效(就像您出于某种原因手动编辑它们一样),WordPress将要求您再次登录获取新的cookies。
我不知道如何绕过那个“无效”检查,这可能是它杀死CodeIgniter cookie的原因?奇怪的是,似乎session_ci
值仍然存在,尽管会话似乎仍然被杀死了。
答案 0 :(得分:1)
您需要将会话开始放在config.php的最顶层。 这是WordPress不会销毁会话的唯一场所。
if (!session_id())
session_start();
如果你的PHP安装没有启用register_global,那么 上面的代码应该允许你使用session,但是,如果是的话,你 将无法获取先前请求中设置的数据。 这是因为WordPress会破坏其中包含的所有数据 会话变量在进行初始化时。
这就是为什么并对此进行故障排除 - > kanasolution.com
扩展答案:
来源:http://codex.wordpress.org/WordPress_Cookies
登录时,wordpress使用wordpress_ [hash] cookie来存储你的 验证细节。它的使用仅限于管理控制台区域, /可湿性粉剂管理员/
登录后,wordpress会设置wordpress_logged_in_ [hash] cookie,表示您何时登录,以及您是谁, 大多数界面使用。
所以WordPress显然不喜欢你写cookie的方式,也许他们缺少8通MD5哈希等? WordPress encryption methods
WordPress环境
接下来我要尝试将自定义登录页面集成到WordPress环境中,而不是仅仅需要标题。 (让我们远离编辑核心)
来自WordPress& Ronald Huereca的AJAX第78页解释了手动加载WordPress环境。
dirname函数的使用取决于文件的层次结构。根据需要调整它们。应在文件标记之前使用代码。
$root = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
if (file_exists($root.'/wp-load.php')) {
require_once($root.'/wp-load.php');
/*Run custom WordPress stuff here */
//Output header HTML, queue scripts and styles, and include BODY content
wp_enqueue_script('my_script', get_stylesheet_directory_uri() . '/my_script.js', array('jquery'), '1.0.0');
wp_print_scripts(array('my_script'));
}