Переезд WordPress сайта на Laravel

Рассмотрим как переехать с сайта на CMS WordPress на популярный PHP фреймворк Laravel. Расскажем про практический случай перехода от WordPress к Laravel в качестве бэкенда с новым дизайном фронтенда, который был сделан на Tailwind CSS.

Зачем переезжать?

С WordPress меня познакомил друг примерно в 2014 году, и я начал вести этот блог, чтобы документировать решения различных проблем, связанных с веб-разработкой, с которыми я постоянно сталкивался, а также для «самодокументации», чтобы ссылаться на них на более поздних этапах.

Один за другим я начал писать все больше и больше блогов. Экосистема WordPress предоставляла все плагины и системы, необходимые для работы блога, но с годами я глубоко погрузился в экосистему Laravel и понял, насколько громоздко менять код бэкенда в WordPress.

Мне всегда хотелось иметь что-то очень простое в бэкенде, чтобы быстро вносить изменения в дизайн или логику блога, и Laravel обеспечил меня именно этим.

Использование пакета Corcel

Поскольку данные привязаны к экосистеме WordPress. Я искал способ использовать существующую структуру базы данных и использовать систему Laravel Eloquent для получения данных. Corcel делает именно это.

Официальный гитхаб — github.com/corcel/corcel

С Corcel вы можете использовать WordPress в режиме headless. Это позволяет вам по-прежнему использовать панель администратора WordPress для управления постами блога, медиа и т.д., и он подключает модель Laravel Model к различным таблицам базы данных ваших существующих таблиц, чтобы вы могли свободно читать / записывать данные через Laravel Model API.

Для примера, вот как я теперь могу получить все посты и разложить их по страницам:

$posts = Post::with([
            'author',
            'taxonomies',
            'thumbnail.attachment'
        ])
            ->where('post_type', 'post')
            ->published()
            ->latest()
            ->paginate(10);

Хостинг приложения

С этого момента мы используем единую базу данных для приложения Laravel и WordPress. Вот как выглядит моя текущая конфигурация:

Переезд WordPress сайта на Laravel

Как показано на изображении выше, я разместил свое приложение на Digital Ocean и управляю им через Forge.

На одном сервере в Digital Ocean размещены два сайта. Один — это приложение Laravel (site.info), ориентированное на пользователя, а другой — приложение WordPress (wp.site.info, ориентированное на администратора и работающее в режиме Headless).

Использование WordPress в режиме headless

Как только вы разместите свое приложение. Вы должны перевести WordPress в режим headless. Это гарантирует, что ваш существующий сайт WordPress больше не будет обслуживать страницы, но при этом вы сможете получить доступ к панели администратора WordPress.

Для этого я установил плагин Headless Mode на WordPress. Плагин блокирует все запросы к сайту WordPress, если запрос не является частью CRON, REST, GraphQL или запроса администратора (вошедшего в систему пользователя). Установив плагин, вы можете по-прежнему использовать wp-admin часть WordPress и полностью отключить (перенаправить) внешние запросы.

Активируйте плагин и добавьте константу HEADLESS_MODE_CLIENT_URL в файл wp-config.php. Если у пользователя (вошедшего в систему) нет возможности edit_posts (редактировать посты), произойдет перенаправление:

define('HEADLESS_MODE_CLIENT_URL', 'https://site.info');

Как насчет медиа/изображений?

Медиа и изображения загружаются с вашего сайта WordPress. Вам нужно убедиться, что URL-адреса в вашей базе данных указывают на новый домен WordPress. Я выполнил следующие запросы, чтобы обновить путь к изображениям:

UPDATE wp_posts SET guid = replace(guid, 'https://site.info', 'https://wp.site.info');

Содержимое записей

Следующим препятствием было сохранение стиля записи WordPress. Содержимое записи хранится в таблице wp_post в столбце post_content. Эти данные содержат HTML-сущности вместе с содержимым, а также WordPress делает много структурирования, например, преобразует переносы строк в абзацы, прежде чем окончательно отобразить содержимое на странице.

Для достижения аналогичных результатов я нашел gist, который реплицирует метод WordPress в трейт. Поскольку я больше не могу найти этот gist, я создал новый здесь.

Теперь я могу сохранить большинство стилей, используя эту функцию и выводя содержимое поста следующим образом:

{!! $post->wpautop($post->content) !!}

Производительность

Laravel действительно обеспечивает лучшую производительность по сравнению с WordPress, и я наблюдаю гораздо более высокую скорость работы страниц. Ниже результаты оценки скорости страниц сервисом Google для главной на основе Laravel.

Переезд WordPress сайта на Laravel

Выбор TailwindCSS

Помимо перехода с WordPress на Laravel, я также перевел фронтенд-фреймворк с Bootstrap на Laravel. Я сделал дизайн сайта в TailwindCSS, и хотя я не силен в разработке фронтенда, думаю, что с TailwindCSS у меня получилось довольно хорошо.

После того как я некоторое время избегал его, я попробовал Tailwind CSS, и он действительно обеспечивает большую интуитивность при создании компонентов фронтенда. Некоторые из многократно используемых компонентов этого блога доступны в библиотеке компонентов Tailwind Stamps.

RSS-канал

WordPress по умолчанию предоставляет RSS-канал. Однако после перехода на Laravel мне пришлось вручную создавать RSS-канал для постов. Здесь на помощь пришел пакет spatie/laravel-feed.

Благодаря этому пакету фид блога можно сделать по тому же адресу как и на WordPress — site.info/feed.

Опубликовано 22 декабря 2022 в 21:39

22 декабря 2022 в 21:39
,