9

我现在需要让 Kohana 3 网站有一个 Wordpress 博客。

我看过 Kerkness 的Kohana For Wordpress,但这似乎与我想要的相反。

这是我想到的选项

  • 为模板设置样式,使其看起来与 Kohana 网站完全相同(耗时、非 DRY 且可能无法正常工作)
  • 将博客包含在一个iframe(丑陋的地狱)中
  • 卷曲 Wordpress 页面。这当然意味着我需要在评论发布等之间创建图层,这听起来工作量太大。

有什么方法可以在现有的 Kohana 应用程序中包含一个 Wordpress 博客?你有什么建议吗?

我发现这篇文章详细介绍了 Kohana for Wordpress 插件,但我仍然对它的工作原理感到困惑。

这是否意味着在 Wordpress 中,我可以调用 Kohana 控制器?在我的情况下这对我有用吗?

4

6 回答 6

8

哦,我很久以前就这样做了(实际上是在去年年底)。

假设

  1. 您正在使用带有 mod_rewrite 或类似选项的 Wordpress 永久链接。
  2. 您没有打开 register_globals() 。关闭它以确保 Wordpress 的全局变量不会被 Kohana 删除。

重命名

首先,您需要重命名__()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;
}

只要您没有定义about控制器和日历操作,它就可以让 Wordpress 重定向任何可能已移动的页面,例如/about/calendar/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 的帮助,请告诉我。

于 2010-08-29T00:43:27.677 回答
4

我实际上已经将 wordpress 用于代码点火器网站的 CMS。这是我用来提取页面内容而不是博客内容的方法,但也许您可以对其进行一些更改以满足您的需求。

在我的前端控制器中,我添加了 wordpress 头文件

require('/path/to/wp-blog-header.php');

这使您可以访问您需要的 2 个功能

get_page()  – Get the page data from the database
wpautop() – Automatically add paragraph tags to page content

获取页面数据

$page_data = get_page( 4 ); // Where 4 is the page ID in wordpress

如果您收到此错误:

致命错误:只能通过引用传递变量……</p>

你必须这样做

$page_id = 4;
$page_data = get_page( $page_id );

由于某些版本的 php中的错误

然后在视图中

<?= wpautop($page_data->post_content) ?>

希望这可以帮助


编辑


我在文件系统的 /blog 上安装了 wordpress。所以wordpress实际上是作为一个博客正常运行的。我只是用这种方法来抓取页面

于 2010-05-13T15:54:26.047 回答
3

由于 WordPress 的工作方式,这将非常困难。具体来说,它在所有地方都使用全局变量,并且由于 Kohana 是作用域的,因此您将无法访问这些变量。

长话短说:你想要的几乎是不可能的。但是,如果你让它工作(没有破解 WP),我真的很想看看你是怎么做到的。

于 2010-05-14T09:14:08.733 回答
1

另一个解决方案是让 Wordpress 和 Kohana 安装完全分开。然后,您创建一个自定义 Wordpress 主题,该主题将从 Kohana 中提取页眉和页脚(您可以为此创建一个 Kohana 控制器)。

加入页眉和页脚后,博客看起来与您的网站集成在一起,即使它仍然是一个完全独立的安装。优点是无需破解 Wordpress 或 Kohana 即可使其正常工作。

在这篇博文中有关于此方法的更多详细信息:将 Wordpress 集成到 Kohana 应用程序中

于 2011-12-16T09:10:50.247 回答
1

见这里: http: //www.intuitivity.org/archives/8 我昨天想通了 :)

于 2010-06-28T21:54:14.140 回答
0

我一直认为这会相对容易。也就是说,使用 WordPress 作为您网站的后端(至少对于博客部分)并使用 Kohana 来提供帖子和页面。如果我没记错的话,您需要做的就是设置模型(帖子、评论、页面)以从 WordPress 数据库(有或没有 ORM)而不是新数据库中收集数据。

于 2010-05-25T13:47:40.940 回答