CodeIgniter中的Wordpress包含会导致会话被破坏

时间:2013-08-12 17:22:07

标签: wordpress codeigniter-2 session-cookies

我必须在我的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启动另一个会话(使用其他名称)
  • COOKIE路径(我不是100%肯定,如果我做得对,因为它根本没有改变。在线阅读一些东西它在所有浏览器中都不能很好地工作)。
  • COOKIE域名(似乎没有效果)

问题是我无法仅在控制器方法中加载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值仍然存在,尽管会话似乎仍然被杀死了。

1 个答案:

答案 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'));
}