如何将Wordpress集成到Kohana中3

时间:2010-05-13 13:43:34

标签: php wordpress kohana integration kohana-3

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

我见过Kerkness'Kohana For Wordpress,但它似乎与我想要的相反。

以下是我想到的选项

  • 将模板设置为与Kohana网站完全相同(耗时,非干,可能无效)
  • 将博客包含在iframe(丑陋的地狱)
  • cURL Wordpress页面。这当然意味着我需要在评论发布等之间创建层,这听起来像是太多的工作。

有没有办法在现有的Kohana应用程序中包含Wordpress博客?你有什么建议吗?

我找到了this post detailing the Kohana for Wordpress plugin,但我仍然对它是如何工作感到困惑。

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

6 个答案:

答案 0 :(得分:8)

哦,我很久以前就做过这件事(实际上是去年年底)。

假设

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

    首先,您需要重命名Kohana中的__()函数。比如说,您将其重命名为__t()。你需要在它出现的任何地方替换它,如果你使用像Netbeans这样可以找到函数或方法用法的编辑器,那就很容易了。

    层次

    您需要做出的下一个决定是,您是否要在Wordpress中的Kohana或Kohana中加载Wordpress。我更喜欢后者,我在下面记录。如果你愿意走这条路,我可以记录后者。

    我把kohana目录放在我的主题目录中。

    在主题的functions.php文件中,只需

    include TEMPLATEPATH . '/kohana/index.php';

    Kohana配置

    你的Kohana的index.php文件也需要一些工作。删除寻找install.php的行,因为它们将加载ABSPATH . WPINC . 'install.php'并在您的wordpress管理员中显示错误消息。您还需要更改error_reporting,因为Wordpress失败E_STRICT。

    您很可能需要删除处理请求的引导程序的最后几行(在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');
    

    其中应用是您选择的课程。

    我的应用程序类的代码(没有类定义)是:

    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 控制器和日历操作

    所以你有它。任何未在Wordpress中定义的网址都将落入您定义的控制器(或使用主题的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');
    

    为了保持网址的一致性,您可能需要从Wordpress永久链接的末尾开始,因此 /%year%/%monthnum%/%day%/%postname%/ 变为 /%year%/%monthnum%/%day%/%postname%


    如果您需要更多帮助整合Wordpress和Kohana,请告诉我。

答案 1 :(得分: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

如果您收到此错误:

  

致命错误:只有变量可以   通过引用传递......

你必须这样做

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

因为某些版本的php中有bug

然后在视图中

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

希望这会有所帮助

<小时/> EDIT


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

答案 2 :(得分:3)

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

长话短说:你想要的几乎是不可能的。但是,如果你让它工作(没有黑客攻击WP),我真的很想知道你是如何做到的。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

另一种解决方案是将Wordpress和Kohana安装完全分开。然后你创建一个自定义的Wordpress主题,从Kohana拉出页眉和页脚(你可以为它创建一个Kohana控制器)。

一旦您有页眉和页脚,博客就会集成到您的网站,即使它仍然是一个完全独立的安装。优点是没有任何东西可以破解Wordpress或Kohana使其正常工作。

在此博客文章中有关于此方法的更多详细信息:Integrating Wordpress into a Kohana application

答案 5 :(得分:0)

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