Как и почему в 2024 году мы разрабатываем сайты для крупных клиентов на WordPress?
Сегодня WordPress — один из лучших бесплатных инструментов на рынке. Как и многие IT-компании, мы начинали с разработки сайтов на коробо��ных решениях с низким порогом входа. Расширив экспертизу и собрав мощную команду, мы научились профессионально «готовить» WordPress и теперь грамотно используем его, чтобы облегчить жизнь себе и нашим клиентам. Коммерческая разработка присутствует там, где есть хорошие разработчики и мощный менеджмент, а инструменты могут быть любыми.
В этой статье мы расскажем, как строим архитектуру наших приложений на WordPress
Любая CMS дает нам админку и ядро, а из ядра выделяется набор функций, которые мы можем использовать для разработки приложений. WordPress дает нам отличный движок на PHP (новые версии постоянно поддерживаются) с хорошей популярной админкой и неограниченным количеством расширений, а всю клиентскую часть мы пишем самостоятельно.
Мы подходим к этому максимально ответственно: продумываем архитектуру, применяем особые подходы к разработке и устанавливаем определенные правила:
- Первое — мы используем систему готовых блоков и компонентов. У WordPress есть редактор Gutenberg (рассказывали об этом в одной из статей), и практически все страницы формируются из блоков, как в Tilda. Этот же принцип переносим и в построение архитектуры: формируем готовые блоки, shared-компоненты, глобальные пейдж-темплейты, отдельно бизнес-фичи и т д.
- Второе — мы не используем JQL, пишем все на чистом JS с использованием объектно-ориентированного подхода к построению логики. Для создания сложных интерфейсов можем на отдельных страницах прикрутить Vue или React (который на WP доступен из коробки). К тому же в WP доступен REST API, и если у нас нет каких-то методов или эндпоинтов, мы можем легко их добавить.
Структура папок и файлов внутри темы WordPress
Файлы в корне темы:
1. style.css - обязательный файл, содержит информацию о теме.
В нем указываются такие данные, как:
- название темы
- версия темы
- минимальная версия WordPress
- версия PHP
2. theme.json - настройки темы (типографика, цветовая палитра)
- Демонстрация настроек:
- Пример файла настроек theme.json
3. functions.php - входной файл для всех скриптов PHP
Тут выполняем объявления глобальных констант, подключение load-файла из папки includes (где лежат все основные PHP-скрипты), подключения load-файла из папки blocks и components
4. header.php - шаблон шапки сайта
Тут выполняется функция wp_head(), которая подключает ресурсы и выводит метатеги
5. footer.php - шаблон подвала сайта
Тут выполняется функция wp_footer(), которая подключает JS-скрипты темы и плагинов
6. page.php - дефолтный шаблон страницы
Как правило, тут выполняется подключение header.php и footer.php c помощью функций get_header() и get_footer() соответственно:
7. package.json - зависимости приложения
8. index.php - пустой индексный файл
Папки:
acf-json — папка для автосохранения конфигов полей и страниц с опциями, созданных плагином Advanced Custom Fields. Это необходимо, если разработка ведется в команде, все изменения полей будут отслеживаться в гите;
assets — тут лежат все стили, скрипты, шрифты и прочие файлы, отвечающие за Frontend;
blocks — кастомные Gutenberg-блоки;
components — переиспользуемые компоненты;includes — папка со всеми скриптами РНР;
page-templates — шаблоны страниц.
Gutenberg blocks
В этой папке хранятся сами блоки в подпапках и файл load.php, в котором находится функция регистрации всех блоков.
Блок представлен в виде папки со следующими файлами:
- block.json — данные для блока, такие как name, title, и т. д.;
- template.php — файл с разметкой блока;
- functions.php — PHP-функции, используемые только в рамках этого блока;
- _index.scss — стили для блока;
- _index.js — скрипты для блока.
Пример файла block.json:
Файл load.php в корне папки blocks:
Components
Примерно такая-же концепция как с Gutenberg-блоками, набор компонентов представленных в виде папок со следующими файлами:
- [component-name].php
- functions.php
- _index.scss
- _index.js
И файл load.php, который подключает все PHP-скрипты всех компонентов:
Используем компоненты с помощью встроенной функции get_template_part(), куда передаем параметром args входные данные:
Внутри файла компонента обозначаем параметры по умолчанию, затем объединяем их с входными параметрами и распаковываем в переменные, на основе которых и строим разметку:
Assets
Все Frontend-файлы, которые не попали ни в components ни в blocks:
- css — папка с общими стилями, глобальными лэйаутами, переменными и миксинами;
- js — папка с утилитарными JS-функциями и настройками webpack;
- resource — папка с прочими файлами, такими как картинки, шрифты, видео и т. д.
В js/config лежат настройки webpack, они могут отличаться от проекта к проекту, но основной принцип такой, что у нас есть 3 точки входа:
- index.js — основная точка входа, используемая во фронт-енд части приложения;
- admin.js — специфические стили и скрипты для admin-части приложения;
- editor.js — специфические стили и скрипты для области редактирования.
После компиляции создается по 3 CSS и JS-файла, которые мы подключаем в соответсвующих хуках WordPress:
- wp_enqueue_scripts — стили и скрипты для фронтенда;
- enqueue_block_editor_assets — стили и скрипты для редактора;
- admin_enqueue_scripts — стили и скрипты для админ-части сайта.
В index.js нужно подключить все файлы блоков и компонентов, выглядит это примерно так:
Такой базовый сетап уже позволяет закрывать 90% задач в рамках разработки кастомной темы для WordPress.
Использование REST API
Для асинхронных запросов мы чаще всего используем WP REST API. Это не единственный способ создать кастомный эндпоинт, но, как показывает практика, самый удобный. Все, что нам нужно сделать — это воспользоваться функцией register_rest_route в хуке rest_api_init и написать функцию-колбэк, которая будет обрабатывать этот маршрут.
Пример создания эндпоинта для блока со списком новостей и фильтрацией по таксономиям мы рассматривали в предыдущей статье:
- wwzrds_generate_pagination — функция, которая формирует разметку пагинации на основе входных данных;
- wwzrds_get_template_string — функция-хелпер, которая возвращает шаблон как строку.
Пример создания эндпоинта:
Пример интеграции React-приложения
Начиная с версии 5 WordPress включает в себя React и позволяет использовать его через пакет wp.element.
Допустим, что мы хотим добавить отдельный React-виджет на сайт.
Необходимо в папке темы создать отдельную папку для файлов виджета и внутри этой папки инициализировать package.json командой:
После этого устанавливаем WP Scripts командой:
Открываем package.json и добавляем следующую секцию:
В этой же папке добавляем webpack.config.js:
В index.js будем использовать метод render не из ReactDom, а из wp.element, в остальном это будет обычное React-приложение:
В App.js поместим основное react приложение. Если нам необходимо импортировать что-то из React или ReactDOM, то импортируем это из wp.element, например:
При подключении react приложения в WordPress указываем зависимость от wp-element:
Добавим отдельный React-виджет на сайт
В папке темы создаем отдельную папку для файлов виджета и внутри этой папки инициализируем package.json командой:
После этого устанавливаем WP Scripts командой:
Открываем package.json и добавляем следующую секцию:
В той же папке добавляем webpack.config.js:
В index.js будем использовать метод render не из ReactDom, а из wp.element, в остальном это будет обычное React-приложение:
В App.js поместим основное react приложение. Если нам необходимо импортировать что-то из React или ReactDOM то импортируем это из wp.element, например:
При подключении react приложения в WordPress указываем зависимость от wp-element:
Такой скелет приложения позволяет очень быстро создавать современные, технологичные и масштабируемые проекты, которые легко поддерживать. Для работы над темой WordPress вы можете использовать публичный репозиторий по ссылке: github.com/WeWizards/WP-start-template
Конечно, многие скажут, что надо писать фронт на Vue или React целиком, получать данные по REST API и т. д. — и мы частично согласны, но каждая задача требует индивидуального подхода, в том числе и в выборе наиболее подходящего инструмента для ее реализации. Подписывайтесь на соцсети We Wizards и читайте о том, как мы делаем Headless WordPress + Vue/React в следующих статьях.