Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CodeIgniter中包含Wordpress会导致会话被破坏_Wordpress_Codeigniter 2_Session Cookies - Fatal编程技术网

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

CodeIgniter中包含Wordpress会导致会话被破坏,wordpress,codeigniter-2,session-cookies,Wordpress,Codeigniter 2,Session Cookies,我不得不将WordPress安装添加到我的CodeIgniter系统中,因此我将它放在名为blog的子映射中,并将该文件夹排除在我的.htaccess中。一切都很好 我已经将所有的WordPress表和放在我的CodeIgniter数据库中,前缀为\uWP 我现在已经将WordPress博客头文件加载到CodeIgniter的index.php,如下所示 require('blog/wp-blog-header.php'); add_filter('site_url', 'ci_site_url

我不得不将WordPress安装添加到我的CodeIgniter系统中,因此我将它放在名为
blog
的子映射中,并将该文件夹排除在我的
.htaccess
中。一切都很好

我已经将所有的WordPress表和放在我的CodeIgniter数据库中,前缀为
\uWP

我现在已经将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'];
}
并在我的
帐户
控制器中创建了一个注册方法,以实际链接到我的
客户
。我这样做是因为我想使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')
    
  • COOKIE路径(我不能100%确定我是否做对了,因为它根本没有改变。在线阅读一些东西,它也不能在所有浏览器中正常工作)
  • COOKIE域(似乎没有效果)
问题是我无法加载
require('blog/wp blog header.php')仅在控制器方法中,因为我需要能够控制WordPress部件的登录状态。除此之外,我还会收到关于
site\u url()
函数的投诉,url助手已经声明了这一点

我认为问题主要是因为CodeIgniter和WordPress都使用自己独特的方式处理会话(数据库中的CI和“超级全局”中的WordPress),这可能只会让他们使用cookie来记住“状态”

我的整个CodeIgniter系统已经在数据库驱动的会话模型上运行了,所以绝对不能进行切换。对于WordPress来说,它的代码特性似乎无法再与session一起工作了(我知道session“do”可以工作,但对于WP核心系统来说,这似乎不算什么)

我还引用了
wp_unregister_GLOBALS()
wp settings.php
文件中

另外,我还尝试在CodeIgniter中重命名我的会话COOKIE名称,以使用类似于
session\u ci

我真的希望有人知道一种方法,能够告诉CodeIgniter或WordPress只更新他们的值,而不是每次都杀死整个会话。我还阅读了一些关于使用
.htaccess
拆分cookie的内容,但在上面找不到好的资源。因此,如果有人知道如何做到这一点,我将永远感激

我绝望了。以98%的价格完成,但最终却让人失望:(

更新

也许我可以在WordPress部分做点什么来处理cookies

遗憾的是,我并不是WordPress世界的老家。这一次我只能使用它,因为人们真的想在博客中使用购买的模板

第页还陈述了以下内容:

WordPress使用这两个cookie绕过wp-login.php的密码输入部分。如果WordPress发现您有有效的、未过期的cookie,则直接转到WordPress管理界面。如果您没有cookie,或cookie已过期,或以其他方式无效(就像您出于某种原因手动编辑它们一样),WordPress将要求您再次登录,以获取新的cookie


我想知道,如何绕过“无效”检查,这可能是它杀死CodeIgniter cookie的原因?奇怪的是,
会话ci
值似乎保持不变,尽管会话似乎仍然被杀死。

您需要将会话开始放在config.php的最顶端。 这是唯一一个会话不会被WordPress破坏的地方

if (!session_id())
session_start();
如果您的PHP安装没有启用register_global,则 上面的代码应该允许您使用会话,但是,如果使用了会话,则 将无法获取以前请求中设置的数据。 这是因为WordPress将销毁其中包含的所有数据 执行初始化时的会话变量

下面是关于此问题的原因和疑难解答->

扩展答案:

资料来源:

在登录时,wordpress使用wordpress_U8;[hash]cookie存储您的 身份验证详细信息。其使用仅限于管理控制台区域, /wp管理员/

登录后,wordpress设置wordpress\u logged\u in\u[hash]cookie,该cookie指示您何时登录以及您是谁 大多数界面使用

所以WordPress显然不喜欢你写cookies的方式,也许他们缺少8遍MD5散列等等

WordPress环境

接下来,我将尝试将您的自定义登录页面集成到WordPress环境中,而不是只需要标题

Ronald Huereca的WordPress&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'));
}

您是否在本地测试此功能?如果是,请将您的项目文件夹压缩后发送给我(可以从个人资料中获取我的电子邮件)。我将四处玩一玩,看看是否可以帮助您完成此操作。请遵循这些操作,(推荐)希望这些有帮助,否则请与我联系。如果可能的话,尝试这种方法,你找到任何有效的方法吗?我去年为一个客户总结了这一点。最后,我将WordPress放在CodeIgniter安装旁边的子文件夹(.htaccess routing)中,并通过一个带有双向加密和