Гутенберг: Динамическая отрисовка RichText

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

Когда я сохраняю содержимое <RichText /> в свои атрибуты и хочу использовать это с render_callback в PHP, получается немного запутанно. Как только текст содержит RichText (жирный, курсив, переносы строк и т. д.), $attributes хранит его довольно сложным образом

attributes: {
    description: {
        type: "text",
        // нет источника, так что все идет непосредственно в HTML-комментарий, удобно для динамического рендеринга
    }
}


...
"render_callback" => function( $attributes ) {
    return "<p>" . $attributes["description"] . "</p>"
}


// var_dump($attributes["description"]
array(3) {
    [0]=>
    string(24) "Рендеринг RichText с "
    [1]=>
    array(5) {
      ["type"]=>
      string(6) "strong"
      ["key"]=>
      string(10) "_domReact4"
      ["ref"]=>
      NULL
      ["props"]=>
      array(1) {
        ["children"]=>
        string(3) "php"
      }
      ["_ower"]=>
      NULL
    }
    [2]=>
    string(22) "это боль в заднице..."
  }

Наверное, есть причина, почему они сохраняют RichText таким образом.
Теперь вопрос:

Как я могу использовать это при динамическом рендеринге?
Есть ли какая-то функция, о которой я не знаю? Например: wp_decode_richtext()

Атрибут в вопросе должен иметь тип “строка”, чтобы он корректно отображался.

attributes: {
    description: {
        type: "string",
    }
}

Ответ или решение

Гутенберг: Динамическое рендеринг RichText

Когда вы сохраняете содержимое компонента <RichText /> в атрибутах и хотите использовать его с использованием render_callback в PHP, ситуация может усложниться, особенно если текст содержит RichText, такой как жирный шрифт, курсив, переносы строк и т.д. Вам может казаться, что данные в $attributes сохраняются не очень удобно.

Проблема

В примере, который вы предоставили, $attributes["description"] хранит данные в следующем формате:

array(3) {
    [0] => string(24) "Rendering RichText with "
    [1] => array(5) {
      ["type"] => string(6) "strong"
      ["key"] => string(10) "_domReact4"
      ["ref"] => NULL
      ["props"] => array(1) {
        ["children"] => string(3) "php"
      }
      ["_ower"] => NULL
    }
    [2] => string(22) " is a pain in the a..."
}

Это представление затрудняет работу с данными, поскольку вы получаете массив, состоящий как из строк, так и из массивов, что не позволяет легко формировать HTML. Основная трудность заключается в том, что RichText сохраняется в виде структуры данных, а не в виде простой строки.

Решение

Чтобы упростить динамическое рендеринг RichText, важно правильно настроить тип атрибута и умело использовать функции WordPress. В первую очередь, атрибут description должен быть объявлен как строка:

attributes: {
    description: {
        type: "string",
    }
}

Использование render_callback

Для рендеринга содержимого RichText в PHP, необходимо использовать функцию, которая может обработать структуру данных, которая ваша переменная $attributes представляет. Одна из таких функций — это wp_kses_post(), которая может помочь удалить нежелательный HTML и обеспечить безопасность.

Вот как можно реализовать динамическое рендеринг RichText:

"render_callback" => function( $attributes ) {
    if ( isset( $attributes['description'] ) ) {
        return wp_kses_post( $attributes['description'] );
    }
    return '';
}

Альтернативные подходы

Если вы хотите полностью вручную реализовать рендеринг RichText из массива, вы также можете использовать функционал JavaScript для преобразования данных в нужную HTML структуру перед передачей их в PHP. Это может быть реализовано с помощью такой функции, как wp_encode_json() для кодирования объектов и использования wp_json_decode() на стороне PHP.

Заключение

Работа с RichText в Gutenberg может показаться сложной из-за сложности структуры данных, в которую он сохраняется. Однако, если вы будете следовать правильным практикам, используя подходящий тип данных для атрибутов и учитывая применения функций безопасности, вы сможете эффективно управлять и рендерить RichText контент в вашем проекте.

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

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

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