Перейти к содержимому

Регистрация паттернов

Перед регистрацией в теме паттерн удобно создать через админку:

  1. Внешний вид → Редактор сайта → Паттерны → + (Создать паттерн)
  2. Заполните: Название, Категории, флажок Синхронизированный (для темы — выключить)
  3. В редакторе соберите композицию из блоков
  4. Сохранить

Чтобы скопировать код паттерна: ⋮ → Копировать все блоки. Полученный block markup — это HTML-разметка блоков, которую вы вставите в файл темы.

Каждый файл в /patterns/ начинается с PHP-комментария с метаданными:

<?php
/**
* Title: Hero
* Slug: themeslug/hero
* Categories: banner, featured
* Description: Hero-секция с заголовком, текстом и кнопкой
* Viewport Width: 1376
* Inserter: true
* Keywords: hero, баннер, главный экран
* Block Types: core/cover
* Post Types: page, post
* Template Types: front-page, home
*/
?>
<!-- wp:group {"layout":{"type":"constrained"}} -->
<!-- ... блоки паттерна ... -->
<!-- /wp:group -->
ПолеОписание
TitleЧеловекочитаемое название (переводимое)
SlugУникальный slug в формате namespace/pattern-name
CategoriesОдна или несколько категорий через запятую
ПолеНазначение
DescriptionПодробное описание (только для скринридеров)
Viewport WidthШирина viewport для превью (в px), обычно 1376
InserterПоказывать ли в инсертере. По умолчанию true. no/false скрывает
KeywordsКлючевые слова для поиска в инсертере, через запятую
Block TypesПривязка к типам блоков: core/cover, core/query, core/post-content
Post TypesОграничение по типам записей: page, post
Template TypesПривязка к типам шаблонов: front-page, home, single

WordPress автоматически регистрирует любой файл из /patterns/ с валидным file header. Это рекомендуемый способ.

Структура файла:

<?php
/**
* Title: Hero
* Slug: themeslug/hero
* Categories: featured
*/
?>
<!-- wp:cover {"url":"<?php echo esc_url( get_theme_file_uri( 'assets/images/hero-bg.jpg' ) ); ?>","dimRatio":50} -->
<div class="wp-block-cover">
<span aria-hidden="true" class="wp-block-cover__background has-background-dim"></span>
<div class="wp-block-cover__inner-container">
<!-- wp:heading {"level":1} -->
<h1><?php esc_html_e( 'Добро пожаловать', 'themeslug' ); ?></h1>
<!-- /wp:heading -->
</div>
</div>
<!-- /wp:cover -->

Для условной регистрации используется register_block_pattern():

add_action( 'init', function() {
register_block_pattern(
'themeslug/hero',
[
'title' => __( 'Hero', 'themeslug' ),
'categories' => [ 'featured' ],
'content' => '
<!-- wp:cover {"dimRatio":50} -->
<div class="wp-block-cover">
<span aria-hidden="true" class="wp-block-cover__background has-background-dim"></span>
<div class="wp-block-cover__inner-container">
<!-- wp:heading {"level":1} -->
<h1>' . esc_html__( 'Добро пожаловать', 'themeslug' ) . '</h1>
<!-- /wp:heading -->
</div>
</div>
<!-- /wp:cover -->
',
]
);
} );

PHP-метод удобен для условной регистрации — например, показать разные паттерны в зависимости от активных плагинов.

add_action( 'after_setup_theme', function() {
remove_theme_support( 'core-block-patterns' );
} );

Отключение удалённых паттернов (с wordpress.org/patterns)

Заголовок раздела «Отключение удалённых паттернов (с wordpress.org/patterns)»
add_filter( 'should_load_remote_block_patterns', '__return_false' );

WordPress предопределяет категории: featured, banner, header, footer, gallery, text, call-to-action, posts, wireframe.

add_action( 'init', function() {
register_block_pattern_category(
'hero-sections',
[ 'label' => __( 'Hero-секции', 'themeslug' ) ]
);
} );
add_action( 'init', function() {
unregister_block_pattern_category( 'wireframe' );
} );

Хорошая практика — оборачивать весь паттерн в Group или Cover. Это позволяет пользователю перемещать паттерн целиком и добавлять CSS-класс к внешнему блоку:

<?php
/**
* Title: Hero
* Slug: themeslug/hero
* Categories: featured
*/
?>
<!-- wp:group {"className":"my-hero-pattern","layout":{"type":"constrained"}} -->
<div class="wp-block-group my-hero-pattern">
<!-- wp:heading -->
<h2><?php esc_html_e( 'Заголовок', 'themeslug' ); ?></h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p><?php esc_html_e( 'Описание.', 'themeslug' ); ?></p>
<!-- /wp:paragraph -->
</div>
<!-- /wp:group -->