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

PHP в паттернах

Паттерны регистрируются на хуке init. В этот момент WordPress компилирует PHP-содержимое паттерна в HTML-разметку блоков и сохраняет её. При рендеринге (в редакторе или на фронте) паттерн — уже чистый HTML.

Ключевое ограничение: На init недоступны глобальный запрос, пост, таксономии. Функции is_home(), is_single(), get_post(), the_title()не работают в паттернах.

<?php if ( is_page() ) : ?>
<?php the_title(); ?>
<?php endif; ?>

Этот код не выполнится корректно — на init нет глобального контекста поста.

Если нужен PHP на этапе рендера — используйте Block Bindings API, но это за рамками паттернов.

Главное преимущество PHP в паттернах — i18n. В отличие от HTML-шаблонов, текст в паттернах можно обернуть в функции перевода:

<!-- wp:heading {"level":1} -->
<h1><?php esc_html_e( 'Добро пожаловать на мой сайт', 'themeslug' ); ?></h1>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p><?php esc_html_e( 'Это мой маленький уголок в интернете.', 'themeslug' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:button -->
<div class="wp-block-button">
<a class="wp-block-button__link wp-element-button">
<?php esc_html_e( 'Узнать больше', 'themeslug' ); ?>
</a>
</div>
<!-- /wp:button -->

Функции i18n, доступные в паттернах:

  • esc_html_e() — вывести и эскейпнуть
  • esc_html__() — вернуть и эскейпнуть
  • _e(), __() — без эскейпинга (только для доверенного текста)

Динамические URL через get_theme_file_uri():

<!-- 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 -->
<h2><?php esc_html_e( 'Заголовок', 'themeslug' ); ?></h2>
<!-- /wp:heading -->
</div>
</div>
<!-- /wp:cover -->

Для изображений внутри wp:image:

<!-- wp:image {"id":123,"src":"<?php echo esc_url( get_theme_file_uri( 'assets/images/logo.png' ) ); ?>"} -->
<figure class="wp-block-image">
<img src="<?php echo esc_url( get_theme_file_uri( 'assets/images/logo.png' ) ); ?>" alt="<?php esc_attr_e( 'Логотип', 'themeslug' ); ?>"/>
</figure>
<!-- /wp:image -->

PHP-циклы позволяют генерировать повторяющиеся структуры без дублирования кода:

<?php
$features = [
[
'title' => __( 'Быстро', 'themeslug' ),
'text' => __( 'Мгновенная загрузка страниц.', 'themeslug' ),
],
[
'title' => __( 'Безопасно', 'themeslug' ),
'text' => __( 'Шифрование и защита данных.', 'themeslug' ),
],
[
'title' => __( 'Удобно', 'themeslug' ),
'text' => __( 'Интуитивный интерфейс.', 'themeslug' ),
],
];
?>
<!-- wp:columns -->
<div class="wp-block-columns">
<?php foreach ( $features as $feature ) : ?>
<!-- wp:column -->
<div class="wp-block-column">
<!-- wp:heading {"level":3} -->
<h3><?php echo esc_html( $feature['title'] ); ?></h3>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p><?php echo esc_html( $feature['text'] ); ?></p>
<!-- /wp:paragraph -->
</div>
<!-- /wp:column -->
<?php endforeach; ?>
</div>
<!-- /wp:columns -->
ДоступноНедоступно
esc_html_e(), __(), _e()is_home(), is_single(), is_page()
esc_url(), esc_attr()get_post(), the_title(), the_content()
get_theme_file_uri()get_the_ID(), get_queried_object()
wp_kses_post()have_posts(), the_post()
home_url(), site_url()wp_nav_menu()
Циклы foreach(), массивыГлобальный $post, $wp_query