Как отобразить HTML-контент с помощью API интерактивности?

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

Я тестирую новый API интерактивности и хочу создать блок, который отображает заголовок и содержимое случайного поста.

Вот содержимое файла render.php:

<?php 
    $block_attributes = get_block_wrapper_attributes()
?>
<div
    <?php echo $block_attributes; ?>
    data-wp-interactive="mystore"
    <?php echo wp_interactivity_data_wp_context( array( 'isOpen' => false ) ); ?>
>
    <button data-wp-on--click="actions.getRandomPost">Покажи мне случайный пост</button>

    <p data-wp-bind--hidden="!context.isOpen">
        <span data-wp-text="context.randomPost.title.rendered"></span>
        <div data-wp-text="context.randomPost.content.rendered"></div>
    </p>
</div>

Вот содержимое файла view.js:

import { store, getContext } from '@wordpress/interactivity'

store( 'mystore', {
    actions: {
        *getRandomPost() { // генераторная функция
            const context = getContext()
            context.isOpen = ! context.isOpen
            if ( context.isOpen ) {
                const posts = yield fetch(
                    'http://' + window.location.hostname + '/wp-json/wp/v2/posts'
                ).then( function( response ){
                    return response.json()
                } )
                context.randomPost = posts[ ( Math.floor( Math.random() * posts.length ) ) ]
            }
        },
    }
} )

Проблема в том, что содержимое поста (context.randomPost.content.rendered) отображается как сырой HTML, без правильной интерпретации как форматированный HTML.

Пример:

<p>Привет, мир! Добро пожаловать в <strong>WordPress</strong>. Это ваш первый пост. Отредактируйте или удалите его, а затем начинайте писать!</p>

Существует ли способ отобразить HTML-содержимое с помощью директивы wp-text? Есть ли специальная директива для рендеринга HTML-содержимого?

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

Чтобы отобразить HTML-контент с использованием API интерактивности в вашем проекте на WordPress, необходимо учесть, что директива data-wp-text отображает только текст и интерпретирует его как таковой. Таким образом, HTML-контент будет отображаться как «сырое» HTML, что приводит к проблеме, с которой вы столкнулись.

Для правильного рендеринга HTML-содержимого, вам потребуется использовать директиву data-wp-html, которая позволяет интерпретировать и выводить HTML-код. Это поможет корректно отображать форматированный HTML, получаемый из поля context.randomPost.content.rendered.

Вот как можно изменить ваш исходный код для решения проблемы:

Изменения в render.php

Замените следующую часть кода:

<div data-wp-text="context.randomPost.content.rendered"></div>

На:

<div data-wp-html="context.randomPost.content.rendered"></div>

В итоге ваш файл render.php будет выглядеть следующим образом:

<?php 
    $block_attributes = get_block_wrapper_attributes();
?>
<div
    <?php echo $block_attributes; ?>
    data-wp-interactive="mystore"
    <?php echo wp_interactivity_data_wp_context( array( 'isOpen' => false ) ); ?>
>
    <button data-wp-on--click="actions.getRandomPost">Show me a random post</button>

    <p data-wp-bind--hidden="!context.isOpen">
        <span data-wp-text="context.randomPost.title.rendered"></span>
        <div data-wp-html="context.randomPost.content.rendered"></div>
    </p>
</div>

Пояснение к изменениям

  1. Использование data-wp-html: Эта директива позволит корректно вывести HTML-контент, извлекаемый из API, что решит вашу проблему с отображением «сырых» HTML-тегов.

Дополнительные рекомендации

  • Убедитесь, что данные, возвращаемые вашим API, безопасны для отображения, особенно если они поступают от пользователей. Использование wp_kses_post() или аналогичных функций для фильтрации данных перед выводом может помочь предотвратить XSS-уязвимости.

  • Если вы используете кэширование в вашем приложении, имейте в виду, что изменения могут не отображаться сразу, поэтому обязательно очищайте кэш после внесения изменений.

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

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

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