哦,我很久以前就做过了(实际上是在去年年底)。
假设
- 您正在使用带有 mod_rewrite 或类似选项的 Wordpress 永久链接。
- 您没有打开 register_globals()。将其关闭以确保 Kohana 不会删除 Wordpress 的全局变量。
重命名
首先,您需要在 Kohana 中重命名 __() 函数。比如说,你把它重命名为__t()。您需要在它出现的任何地方替换它,如果您使用像 Netbeans 这样可以找到函数或方法用法的编辑器,这非常容易。
层次结构
您需要做出的下一个决定是您是要在 Kohana 中加载 Wordpress 还是在 Wordpress 中加载 Kohana。我更喜欢后者,我将在下面记录。如果您愿意走那条路,我可以记录后者。
我把 kohana 目录放在我的主题目录中。
在你的主题的functions.php文件中,简单地
include TEMPLATEPATH . '/kohana/index.php';
Kohana 配置
您的 Kohana 的 index.php 文件也需要一些工作。删除查找 install.php 的行,因为它们将加载 ABSPATH . WPINC . 'install.php' 并在您的 wordpress 管理员中显示错误消息。您还需要在 Wordpress 失败 E_STRICT 时更改 error_reporting。
您很可能需要删除处理请求的引导程序(在 Kohana 中)的最后几行,并更改您的 init:
Kohana::init(array(
'base_url' => get_bloginfo('home') . '/',
'index_file' => '',
));
在您的 Wordpress functions.php 文件或引导程序中,添加以下行:
remove_filter('template_redirect', 'redirect_canonical');
add_filter('template_redirect', 'Application::redirect_canonical');
其中 Application 是您选择的类。
Application 类(没有类定义)的代码是:
public static function redirect_canonical($requested_url=null, $do_redirect=true)
{
if (is_404() && self::test_url())
{
echo Request::instance()->execute()->send_headers()->response;
exit;
}
redirect_canonical($requested_url, $do_redirect);
}
public static function test_url($url = NULL)
{
if ($url === NULL)
{
$url = str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']);
$url = trim($url, '/');
}
foreach (Route::all() as $route)
{
/* @var $route Route */
if ($params = $route->matches($url))
{
$controller = 'controller_';
if (isset($params['directory']))
{
// Controllers are in a sub-directory
$controller .= strtolower(str_replace('/', '_', $params['directory'])).'_';
}
// Store the controller
$controller .= $params['controller'];
$action = Route::$default_action;
if (isset($params['action']))
{
$action = $params['action'];
}
if (!class_exists($controller))
return false;
if (!(method_exists($controller, 'action_' . $action) || method_exists($controller, '__call')))
return false;
return true;
}
}
return false;
}
这让 Wordpress 可以重定向任何可能已移动的页面,例如/about/calendar 到 /calendar 只要您没有定义 about 控制器和 calendar 操作.
所以你有它。任何未在 Wordpress 中定义的 url 都将属于您定义的控制器(或使用您主题的 404 模板)。
附加
这不是必需的,但您可以将主题的 header.php 放在您的 kohana 视图文件夹(应用程序或模块中)以及您的任何主题文件中
echo View::factory('header')
您可以对页脚(或任何其他文件)执行相同的操作。在你的 header.php 中,你也可以这样做:
if (isset($title)) echo $title; else wp_title(YOUR_OPTIONS);
这样你就可以在你的控制器中
echo View::factory('header')->set('title', 'YOUR_TITLE');
为了保持 url 一致,您可能需要从 Wordpress 永久链接的末尾删除 /,以便 /%year%/%monthnum%/%day%/%postname%/ 变为 >/%year%/%monthnum%/%day%/%postname%等
如果您需要更多关于集成 Wordpress 和 Kohana 的帮助,请告诉我。