Переезд 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. Вот как выглядит моя текущая конфигурация:

Как показано на изображении выше, я разместил свое приложение на 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.

Выбор 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