Когда я впервые столкнулся с задачей синхронизации Gutenberg template parts с реальными файлами темы, я понял: привычный подход через базу данных WordPress — это не всегда удобно. Изменил блок в редакторе — а в файлах темы ничего не отражается. Ручное редактирование кода? Нет, спасибо. Мне нужен был Gutenberg Sync, который работает автоматически и при этом максимально гибкий.
В этой статье я расскажу, как я сделал плагин Gutenberg Sync, что он делает и как он устроен поверхностно, без глубокой технической воды, но с понятной логикой.
Почему нужен Gutenberg Sync
Основная проблема, с которой сталкиваются разработчики и студии: вы меняете хедер, футер или секцию в редакторе блоков, но все изменения остаются только в базе данных WordPress.
Это значит:
- Вы не можете быстро обновить файл темы.
- Если кто-то другой работает с кодом — изменения теряются.
- Любая ручная правка в файле — риск конфликтов.
Вот тут на помощь приходит Gutenberg Sync. Суть проста: любые изменения в template parts, которые вы делаете в редакторе, автоматически или вручную сохраняются в соответствующие HTML-файлы темы.
Как работает плагин
Я разделил функционал на два уровня:
1. Ручная синхронизация блока
В редакторе рядом с каждым template-part появляется кнопка Sync to file. Нажимая её, вы сохраняете именно тот блок, который редактируете, прямо в файл темы.
Внутри это работает так:
- Скрипт React получает
clientIdблока и его атрибуты. - Через
serializeберутся все вложенные блоки внутри выбранного template-part. - Содержимое отправляется на сервер через REST API плагина.
- PHP проверяет, есть ли файл в папках
parts,templates. - Если файл найден — обновляется содержимое, если нет — появляется уведомление.
Таким образом вы всегда знаете, что редактируемый блок в редакторе точно соответствует файлу темы.
2. Автоматическая синхронизация при сохранении
Чтобы не думать о каждом клике, я добавил авто-sync:
- При сохранении поста или страницы плагин проходит по всем блокам
template-partна странице. - Каждый блок сериализуется и отправляется в файл.
- Всё происходит тихо на фоне, вы видите только уведомление в консоли (для дебага).
Так вы можете редактировать в Gutenberg, а файлы темы всегда актуальны.
Поддерживаемые папки
Чтобы не затрагивать весь код темы, плагин работает только с конкретными папками:
parts— хедер, футер, секцииtemplates— страницы и шаблоны контента
Любой файл вне этих папок игнорируется. Это снижает риск случайного перезаписывания важного кода.
Как я сделал синхронизацию
С точки зрения кода всё строится вокруг двух частей:
- PHP — REST API для записи и получения списка файлов. Проверяется наличие файла, записывается содержимое, возвращается результат. Всё безопасно: права проверяются через
current_user_can('edit_posts'). - JavaScript / React — добавление кнопки в редактор Gutenberg. Используются хуки WordPress (
addFilter) иselectиз@wordpress/dataдля получения блоков. Важный момент: берутся только вложенные блоки выбранного template-part, чтобы не сохранять лишнее.
Дополнительно есть debug-логи, которые помогают проверять, что скрипт загружен и синхронизация выполняется.
Кому нужен этот плагин
- Студиям, создающим сайты на Gutenberg-блоках.
- Тем, кто активно использует template parts и хочет работать напрямую с файлами темы.
- Разработчикам, которым важно, чтобы изменения в редакторе мгновенно попадали в код.
Идеально подходит для современных тем, где структура блоков продумана и нужна быстрая синхронизация с файлами.
Резюме
Создавая этот Gutenberg Sync, я хотел решить три задачи:
- Сделать работу с шаблонами удобной и прозрачной.
- Исключить ручное редактирование файлов для каждого изменения.
- Обеспечить автоматическую синхронизацию при сохранении страницы.
Сейчас плагин позволяет:
- Сохранять изменения конкретного блока вручную.
- Автоматически обновлять все template-part при сохранении.
- Работать с конкретными папками темы, чтобы не трогать лишний код.
Если вы используете Gutenberg и хотите полный контроль над шаблонами, Gutenberg Sync — идеальный инструмент для синхронизации редактора и файлов с шаблонами в вашей блочной WordPress теме.