4

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

我已将所有 WordPress 表与我的 CodeIgniter 数据库中的前缀放在一起_wp

我现在已经将 WordPress 博客头文件加载到index.phpCodeIgniter 中,如下所示;

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 都使用自己独特的方式来处理会话(数据库中的 CI 和“超级全局”中的 WordPress),这可能只会让他们使用 cookie 来记住“状态”。

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

wp_unregister_GLOBALS();我也在文件中引用了wp-settings.php

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

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

我很绝望。完成了 98%,然后最后得到了这样的失望:(..

更新

也许我可以在处理 cookie 的 WordPress 部分做一些事情?

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

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

页面还说明了以下内容;

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

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

4

1 回答 1

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 来存储您的身份验证详细信息。它的使用仅限于管理控制台区域,/wp-admin/

登录后,wordpress 设置 wordpress_logged_in_[hash] cookie,它指示您何时登录,以及您是谁,用于大多数界面使用。

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

WordPress 环境

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

From WordPress & AJAX by Ronald Huereca 第 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'));
}
于 2013-08-21T02:52:03.770 回答