Как интегрировать Wordpress в Kohana 3 - PullRequest
9 голосов
/ 13 мая 2010

Теперь мне нужно, чтобы на сайте Kohana 3 был блог Wordpress.

Я видел Kerkness ' Kohana For Wordpress , но, похоже, это противоположно тому, что я хочу.

Вот варианты, о которых я подумал

  • Создайте шаблон, который будет выглядеть точно так же, как сайт Kohana (отнимает много времени, не СУХОЙ и может не работать)
  • Включите блог в iframe (ужасно, как весь ад)
  • взломать страницы Wordpress. Это, конечно, означает, что мне нужно будет создавать слои между публикацией комментариев и т. Д., Что звучит как слишком много работы.

Можно ли как-нибудь включить блог Wordpress в существующее приложение Kohana? Есть ли у вас какие-либо предложения?

Я нашел этот пост с подробным описанием плагина Kohana for Wordpress , но я все еще не уверен, как он работает.

Значит ли это, что в Wordpress я могу вызвать контроллер Kohana? Это полезно для меня в моей ситуации?

Ответы [ 6 ]

8 голосов
/ 29 августа 2010

О, я сделал это давным-давно (на самом деле к концу прошлого года).

Предположения

  1. Вы используете постоянные ссылки Wordpress с mod_rewrite или аналогичной опцией.
  2. Вы не включили register_globals (). Отключите его, чтобы глобальные переменные Wordpress не удалялись Kohana.

переименование

Во-первых, вам нужно переименовать функцию __() в Kohana. Скажем, вы переименовали его в __t(). Вам нужно будет заменить его везде, где он появляется, что, если вы используете редактор, такой как Netbeans, который может найти использование функции или метода, довольно прост.

Иерархия

Следующее решение, которое вам нужно принять, это то, хотите ли вы загружать Wordpress внутри Kohana или Kohana внутри Wordpress. Я предпочитаю последнее, которое я документирую ниже. Я мог бы документировать последнее, если вы предпочитаете идти по этому пути.

Я поместил каталог kohana в каталог моей темы.

В вашем файле functions.php вашей темы просто

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

Конфигурация Kohana

Файл index.php вашего Kohana также нуждается в некоторой работе. Удалите строки, которые ищут файл 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 и действия calendar .

Так что у вас это есть. Все URL, не определенные в 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');

Чтобы сохранить согласованность URL-адресов, вам, возможно, придется снять / с конца постоянных ссылок Wordpress, чтобы /% year% /% monthnum% /% day% /% postname% / становилось /% year% /% monthnum% /% day% /% postname% и т. д.


Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь в интеграции Wordpress и Kohana.

4 голосов
/ 13 мая 2010

Я на самом деле использовал 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

Тогда в поле зрения

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

Надеюсь, это поможет


EDIT

Я установил WordPress в / blog в файловой системе. Так что WordPress на самом деле работает как блог. Я просто использую этот метод для захвата страниц

3 голосов
/ 14 мая 2010

Это будет чрезвычайно сложно из-за того, как работает WordPress. В частности, он использует глобальные переменные повсеместно, и, поскольку область Kohana ограничена, вы не сможете получить доступ к этим переменным.

Короче говоря: то, что вы хотите, почти невозможно. Однако, если у вас все получится (без взлома WP), мне было бы очень интересно посмотреть, как вы это сделали.

1 голос
/ 16 декабря 2011

Другое решение состоит в том, чтобы сохранить обе установки Wordpress и Kohana полностью раздельно. Затем вы создаете пользовательскую тему Wordpress, которая будет извлекать верхний и нижний колонтитулы из Kohana (для этого вы можете создать контроллер Kohana).

Когда у вас есть верхний и нижний колонтитулы, блог выглядит интегрированным с вашим сайтом, хотя это все еще совершенно отдельная установка. Преимущество в том, что Wordpress или Kohana не нужно взламывать, чтобы заставить его работать.

В этом сообщении блога есть некоторые подробности об этом методе: Интеграция Wordpress в приложение Kohana

1 голос
/ 29 июня 2010

Смотрите здесь: http://www.intuitivity.org/archives/8 Я понял это вчера:)

0 голосов
/ 25 мая 2010

Я всегда думал, что это будет относительно легко. То есть использовать WordPress в качестве бэк-энда вашего сайта (по крайней мере, для части блога) и использовать Kohana для показа постов и страниц. Если я не ошибаюсь, все, что вам нужно сделать, это настроить ваши модели (пост, комментарий, страница) для сбора их данных из базы данных WordPress (с ORM или без) вместо новой.

...