Перейти к содержанию

Паттерны блоков

У темы появились общий хедер и футер. Теперь повторение встречается внутри самих материалов: описание каждого курса должно объяснять аудиторию, предпосылки и учебный результат. Если редактор каждый раз вручную создаёт заголовки и абзацы, структура начинает расходиться. Добавим паттерн — готовый набор блоков для вставки. Результат урока — одна повторяемая форма введения, при которой текст разных курсов остаётся самостоятельным.

Паттерн полезен как начальная структура, но не заменяет модель курса и не создаёт поля базы данных. Вставив обычный паттерн, редактор получает блоки, которые может изменять в конкретном материале. Общая будущая правка файла не обязана переписать уже вставленное содержимое. Это важнее любого визуального сходства карточек: надо решить, что повторяем — структуру, общий текст или одну связанную сущность. Способы регистрации описаны в руководстве по паттернам темы.

Паттерн введения курса

В pw-workshop создадим каталог patterns и файл course-intro.php. WordPress может зарегистрировать файл паттерна темы по его заголовку. PHP здесь нужен для формата файла и возможности серверных вставок, однако наш пример содержит статическую блоковую разметку. Полное содержимое файла показано ниже. Его текст является заготовкой, которую редактор обязательно меняет после вставки; мы не публикуем четыре курса с одинаковым описанием.

<?php
/**
 * Title: Введение в учебный курс
 * Slug: pw-workshop/course-intro
 * Categories: text
 * Description: Audience, prerequisites and expected learning result.
 */
?>
<!-- wp:group {"layout":{"type":"constrained"}} -->
<div class="wp-block-group"><!-- wp:heading -->
<h2 class="wp-block-heading">Для кого этот курс</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Укажите исходные знания читателя и задачу, которую он сможет решить.</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">Что понадобится</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Назовите среду, материалы предыдущих уроков и ограничения примера.</p>
<!-- /wp:paragraph --></div>
<!-- /wp:group -->

Title помогает найти паттерн в редакторе, Slug обозначает его идентификатор. Префикс pw-workshop уменьшает риск столкновения с другим набором. Это не URL страницы и не слаг курса. Категория text группирует заготовку в выборе паттернов, а не относит записи сайта к рубрике. Видимое сходство слов «категория» не должно смешивать библиотеку редакторских блоков с таксономией опубликованных материалов.

Создайте отдельный черновик обычной страницы «Проба курса», не меняя исходную страницу study. Найдите «Введение в учебный курс», вставьте его один раз и замените текст для курса JavaScript: читатель знает базовую HTML-разметку, а после прохождения сможет обработать события и запросить данные API. Для предпосылок укажите редактор кода и браузер. Это пробный редакционный документ, который не входит в нашу карту публичных адресов и не считается будущим объектом pw_course.

Структура и данные после вставки

После сохранения повторно откройте черновик. Ожидается группа с двумя заголовками и двумя собственными абзацами. Вставьте тот же паттерн в другой пробный документ о Markdown и измените аудиторию. Первый документ должен сохранить текст о JavaScript. Именно независимость вставленного содержимого позволяет использовать обычный паттерн как форму, а не общий склад текста. Если изменения неожиданно распространились на обе страницы, выясните, не создан ли вместо обычной вставки синхронизированный паттерн.

Теперь измените заголовок в файловом паттерне на «Кому подойдёт курс». Новая вставка должна использовать новую заготовку; ранее сохранённые блоки не обязаны измениться. Это ожидаемая семантика несинхронизированной структуры. На настоящем сайте для массовой редакционной замены понадобился бы отдельный процесс с просмотром каждого материала. Глобальная замена в базе без анализа контекста может испортить авторские формулировки, которые уже были сознательно изменены после первоначальной вставки.

Синхронизированный паттерн решает другую задачу: несколько мест показывают одну общую редактируемую сущность. Он может подходить для общего предупреждения о формате примеров или одинакового контакта редакции. Для аудитории разных курсов такая связь ошибочна. Изменив описание JavaScript, вы не хотите заменить описание Markdown. Поэтому сначала задаём договор о данных, затем выбираем механизм повторения. В нашей файловой теме регистрируется обычная заготовка; создание синхронизированного объекта в базе не входит в этот код.

Когда нужен блок вместо паттерна

Если вводный раздел должен автоматически показывать число уроков из метаданных, обычный абзац паттерна не решает задачу. Число, введённое вручную, расходится с отдельным полем курса. Здесь нужен динамический источник либо поддерживаемая привязка данных, которую проект реализует отдельно. Не добавляем неподтверждённый JavaScript поверх текста только ради автоматической подстановки. Позднее зарегистрируем pw_lessons как структурированное поле, но полнофункциональный динамический блок курса остаётся дальнейшим расширением.

Паттерн можно использовать внутри шаблона через блок Pattern с соответствующим slug, но это тоже требует понимать результат вставки и представления. В нашей серии начальный паттерн применяется редактором в содержимом. Мы не подменяем им общую часть header: у хедера другой жизненный цикл и механизм подключения. Так меньше шансов получить несколько независимых копий верхней навигации, каждая из которых потребует отдельной правки после изменения меню.

Рассмотрим ошибку подготовки: в паттерне оставлен H1 «JavaScript». После вставки в страницу тема уже выводит H1 текущего документа, и возникает второй основной заголовок. Вместо исправления CSS измените заготовку: название курса берётся из поля заголовка, внутри остаются H2 разделов. Другая ошибка — вставить кнопку со ссылкой на чужой стенд. Структурная заготовка не должна тащить случайный адрес, который редактор забудет заменить.

Если редактору требуется свобода перестановки разделов, паттерн её оставляет. Если требуется жёсткая обязательная форма, одной заготовки недостаточно: после вставки можно удалить заголовок или абзац. Блокировка перемещения и удаления, когда она применяется, решает часть интерфейсной задачи, но не подтверждает полноту текста. Для наших курсов сначала проверяем содержание редакционно. Не называем паттерн схемой валидации материала и не считаем одинаковое дерево блоков доказательством одинакового качества объяснения.

Проверка редакторского результата

Сверьте две самостоятельные пробные страницы: у каждой свой текст, одинаковая понятная структура и отсутствие технических подсказок, оставшихся в опубликованной версии. Для завершения добавьте в карточку материала пункт «заготовки заменены содержанием». Это конкретная проверка: строка «Укажите исходные знания» должна исчезнуть, а ответ на этот вопрос — появиться. Она отличается от требования соблюдать одинаковый объём или одинаковый стиль каждой главы.

Файл паттерна создан как учебный исходник; регистрация в WordPress и вставки здесь не выполнялись. Ожидаемое поведение нужно подтвердить на выбранной версии и с актуальным источником шаблонов. После прохождения удалите пробные черновики либо оставьте их с явной редакционной отметкой, не добавляя в меню. Следующий урок задаст общую палитру и ширину содержимого через theme.json: одинаковая структура станет визуально согласованной без ручной настройки каждого блока.

Оглавление серии