Вопрос или проблема
Я создал шаблон блока, чтобы каждая новая запись начиналась с определённой коллекции блоков.
В приведённом ниже сокращённом примере, предположим, что шаблон блока содержит только заголовок и параграф (на самом деле шаблон блока гораздо сложнее):
function register_custom_block_template() {
$post_type_object = get_post_type_object( 'post' );
$post_type_object->template = array(
array( 'core/heading', array(
'placeholder' => 'Заголовок записи',
) ),
array( 'core/paragraph', array(
'placeholder' => 'Параграф записи',
) ),
);
}
add_action( 'init', 'register_custom_block_template' );
Иногда, в зависимости от определённого действия, я хочу программно добавить запись, используя wp_insert_post()
, которая будет использовать тот же или подобный шаблон блока. Однако для того, чтобы добавить те же блоки внутри ключа “post_content” массива wp_insert_post, мне нужно вручную переписать все массивы PHP шаблона блока в формат HTML/Комментарии, используемый редактором блоков:
// Программное добавление новой записи
wp_insert_post(
array(
'post_title' => 'Тестовая запись',
'post_content' => '
<!-- wp:heading {"placeholder":"Заголовок записи"} -->
<h2></h2>
<!-- /wp:heading -->
<!-- wp:paragraph {"placeholder":"Параграф записи"} -->
<p></p>
<!-- /wp:paragraph -->',
'post_status' => 'publish',
'post_author' => 1,
)
);
Как мне повторно использовать массивы PHP шаблона блока внутри wp_insert_post()
, т.е. добавив массивы в общую переменную? Предполагается, что WordPress выполняет эту конвертацию, поскольку, когда создаётся новая запись, шаблон блока будет преобразован из PHP/массивов в HTML/комментарии в новой записи, значит, в ядре должна быть какая-то функция для этого?
Что мне в основном нужно, так это что-то вроде этого:
// Шаблон блока
$block_template = array(
array( 'core/heading', array(
'placeholder' => 'Заголовок записи',
) ),
array( 'core/paragraph', array(
'placeholder' => 'Параграф записи',
) ),
);
// Шаблон записи (для новосозданных записей)
function register_custom_block_template() {
$post_type_object = get_post_type_object( 'post' );
$post_type_object->template = $block_template;
}
add_action( 'init', 'register_custom_block_template' );
// Программное добавление новой записи
wp_insert_post(
array(
'post_title' => 'Тестовая запись',
'post_content' => $block_template,
'post_status' => 'publish',
'post_author' => 1,
)
);
Я немного изменил serialize_block:
function serialize_block_template( $block ) {
$block_content="";
if (isset($block[2])) {
$index = 0;
foreach ( $block[2] as $chunk ) {
$block_content .= is_string( $chunk ) ? $chunk : serialize_block_template( $block[2][ $index++ ] );
}
}
return get_comment_delimited_block_content(
$block[0],
$block[1],
$block_content
);
}
Отказ от ответственности: может содержать некоторые ошибки, я тестировал это только для одного простого случая использования.
Ответ или решение
Чтобы использовать архитектуру блоков WordPress и программно добавлять новые посты с предустановленным набором блоков, нам необходимо понять, как преобразовать массив блоков в тот формат, который WordPress ожидает в поле post_content
. Мы можем использовать функцию serialize_block()
для этой цели, так как она отвечает за сериализацию блоков в нужный нам формат HTML с комментариями.
Шаг 1: Определение структуры блоков
Для начала, определим массив блоков, который мы будем использовать как шаблон. Это будет наш "блок-шаблон", который мы создадим в функции register_custom_block_template()
и используем при вставке нового поста.
function get_block_template() {
return array(
array( 'core/heading', array(
'placeholder' => 'Post Heading',
) ),
array( 'core/paragraph', array(
'placeholder' => 'Post Paragraph',
) ),
);
}
Шаг 2: Регистрация шаблона блоков
Затем, в функции register_custom_block_template()
, мы можем установить этот массив в свойство template
для типа постов post
:
function register_custom_block_template() {
$post_type_object = get_post_type_object( 'post' );
$post_type_object->template = get_block_template();
}
add_action( 'init', 'register_custom_block_template' );
Шаг 3: Сериализация блоков перед добавлением поста
Теперь, чтобы программно добавить новый пост с использованием этого шаблона, мы можем сериализовать массив блоков в подходящий формат, используя serialize_block()
:
function create_post_with_blocks() {
$block_template = get_block_template();
$content = '';
foreach ($block_template as $block) {
$content .= serialize_block($block) . "\n";
}
// Программно вставить новый пост
wp_insert_post(
array(
'post_title' => 'Test Post',
'post_content' => $content,
'post_status' => 'publish',
'post_author' => 1,
)
);
}
Важно!
-
Функция
serialize_block()
из ядра WordPress автоматически преобразует массив блоков в нужный формат с комментариями. Важно убедиться, что эта функция доступна в вашем контексте выполнения, поскольку она не всегда может быть загружена в момент инициализации. -
Кодировку контента в переменной
$content
следует аккуратно обрабатывать, чтобы избежать проблем с форматом. Убедитесь, что вы используете правильные функции, избегая прямой манипуляции с HTML, если это не требуется.
Заключение
Используя вышеприведенный код, вы сможете легко добавить новые посты с заранее определенным набором блоков, не прибегая к ручной записи HTML каждый раз. Это значительно упростит процесс создания новых постов и позволит вам придерживаться единообразия в их структуре.
Таким образом, регистрируя шаблон блоков и сериализуя его перед вставкой поста, вы можете эффективно управлять содержимым ваших записей в WordPress.