当前位置: 首页 > 知识库问答 >
问题:

WordPress包含在CodeIgniter导致被破坏的会话

壤驷坚
2023-03-14

我必须添加一个WordPress安装到我的CodeIgniter系统,所以我把它放在一个名为blog的子图中,并在我的. htaccess中排除了该文件夹。一切都很好。

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

我现在已经将WordPress博客头文件加载到索引中。CodeIgniter的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')然后在加载WordPress后为CodeIgniter启动另一个会话(使用另一个名称)
  • COOKIE路径(我不能100%确定我是否做对了,因为它根本没有改变。在线阅读一些东西,它也不能在所有浏览器中正常工作)
  • COOKIE域(似乎没有效果)

问题是我不能加载要求('blog/wp-blog-header.php');只在控制器方法中,因为我需要能够控制WordPress部分的登录状态。除此之外,我还会收到关于site_url()函数的投诉,URL助手已经声明了这一点。

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

我的整个CodeIgniter系统已经运行在数据库驱动的会话模型上,所以绝对不能进行切换。对于WordPress来说,它似乎甚至不能用它的代码功能与会话一起工作(我知道会话“做”工作,但这似乎对WP核心系统没有任何影响)。

我还引用了wp_unregister_GLOBALS() wp设置中选择code>。php文件。

另外,我还试图在CodeIgniter中重命名我的会话COOKIE名称,以使用类似于session_ci

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

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

最新消息

也许我可以在处理cookie的WordPress部分做些什么?

http://codex.wordpress.org/Function_Reference/wp_set_auth_cookie

可悲的是,我不是真正的家在WordPress的世界。我只需要使用它这一次由于买了模板,人们真的想在博客中使用。

本页还说明了以下内容:;

WordPress使用这两个cookie绕过wp登录的密码输入部分。php。如果WordPress确认您拥有有效的、未过期的Cookie,则直接转到WordPress管理界面。如果您没有cookie,或者cookie已过期,或者以其他方式无效(例如您出于某种原因手动编辑了cookie),WordPress将要求您重新登录,以获取新的cookie。

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

共有1个答案

桓深
2023-03-14

您需要将会话开始放在配置的最上面。php。这是唯一一个会话不会被WordPress破坏的地方。

if (!session_id())
session_start();

如果您的PHP安装没有启用register_global,上面的代码应该允许您使用会话,但是,如果它启用了,您将无法获得先前请求中设置的数据。这是因为WordPress在进行初始化时会销毁会话变量中包含的所有数据。

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

扩展答案:

资料来源:http://codex.wordpress.org/WordPress_Cookies

登录时,wordpress使用wordpress_[hash]cookie来存储您的身份验证详细信息。它的使用仅限于管理控制台区域, /wp-admin/

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

所以WordPress显然不喜欢你写cookie的方式,也许他们缺少8通MD5哈希等?WordPress加密方法

WordPress环境

接下来,我将尝试将您的自定义登录页面集成到WordPress环境中,而不是只需要标题。(让我们远离编辑核心)

来自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'));
}
 类似资料:
  • 我有一个关于会话范围的CDIBeans的生命周期的问题 据我所知,会话范围的CDIBean在会话启动时由容器构造,在会话结束时由容器销毁。在销毁bean之前,将调用@PreDestroy方法,如下所述https://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html.它还说用这种方法释放资源 在JSF应用程序中,我构建时遇到内存泄漏,因为bean似乎没

  • 成功登录后,我将保存会话变量。 当用户转到应用程序中的不同页面时,会话就消失了,即使我没有显式地销毁会话。我该怎么解决这个问题? 这是一个会话似乎消失的页面。 在中,我有会话开始方法。

  • 我ogin.php 指数php 我做了一个登录脚本,打开,如果密码是正确的,我ndex.php网站。当第一次通过登录脚本打开ndex.php网站时,一切正常,会话设置完毕。但是在我刷新页面后,会话会被破坏,并且没有设置。那么我如何保存会话,这样它就不会因为刷新浏览器而被破坏呢?

  • 问题内容: 我有一个用Restify和Mongoose在node.js中构建的REST服务,以及一个mongoDB,它的集合包含大约30.000个常规大小的文档。我的节点服务通过pmx和pm2运行。 昨天,节点突然开始通过消息“ MongoError:拓扑已被破坏”消除错误,仅此而已。我不知道这是什么意思,可能触发了什么。谷歌搜索时也没有太多发现。所以我想在这里问。 今天重新启动了节点服务后,错误

  • 1998年12月25日晚上(我的计算机时钟绝对准确),在进行完日常的一系列操作后,又准备对系统进行一下“挖潜”工作,我相信这是大多数PC 发烧友的共同爱好。主板的BIOS已经被升级过好几次了,而且目前我还没找到更新的BIOS升级数据文件,所以我把目光转向了主板附带光盘上的DMI(Desktop Management Interface,桌面管理接口)程序。DMI为用户提供了一个与系统硬件直接对话的

  • 问题内容: 我听过关于此主题的不同回答,那么销毁PHP会话的肯定方法是什么? 在最简单的情况下,这是否足以真正终止用户与服务器之间的会话? 问题答案: 要销毁会话,您应该采取以下步骤: 删除会话数据 使会话ID无效 为此,我将使用以下代码: 为了确保会话ID无效,您应该只允许脚本启动的会话ID。因此,设置一个标志并检查它是否被设置: 此外,您可以使用此时间戳定期交换会话ID,以缩短其寿命: