Добавьте шаблон блока PHP в содержимое с помощью wp_insert_post

Вопрос или проблема

Я создал шаблон блока, чтобы каждая новая запись начиналась с определённой коллекции блоков.

В приведённом ниже сокращённом примере, предположим, что шаблон блока содержит только заголовок и параграф (на самом деле шаблон блока гораздо сложнее):

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,
        )
    );
}

Важно!

  1. Функция serialize_block() из ядра WordPress автоматически преобразует массив блоков в нужный формат с комментариями. Важно убедиться, что эта функция доступна в вашем контексте выполнения, поскольку она не всегда может быть загружена в момент инициализации.

  2. Кодировку контента в переменной $content следует аккуратно обрабатывать, чтобы избежать проблем с форматом. Убедитесь, что вы используете правильные функции, избегая прямой манипуляции с HTML, если это не требуется.

Заключение

Используя вышеприведенный код, вы сможете легко добавить новые посты с заранее определенным набором блоков, не прибегая к ручной записи HTML каждый раз. Это значительно упростит процесс создания новых постов и позволит вам придерживаться единообразия в их структуре.

Таким образом, регистрируя шаблон блоков и сериализуя его перед вставкой поста, вы можете эффективно управлять содержимым ваших записей в WordPress.

Оцените материал
Добавить комментарий

Капча загружается...