Могу ли я использовать вывод шорткода в качестве значения атрибута HTML?

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

В пределах элемента span, вывод шорткода работает:

<span>[sola_testimonials_count type="all"]</span>

Результат:
<span>5,205</span>

Но как значение атрибута, он не обрабатывается:

<span data-value="[sola_testimonials_count type='all']"></span>

Результат:
<span data-value="[sola_testimonials_count type='all']"></span>

Это сторонний плагин, но у меня есть код и я могу его изменить. Есть ли способ заставить шорткод обрабатываться как значение HTML-атрибута? Я не разработчик WordPress, поэтому простите, если это очевидный ответ.

Большое спасибо!

Я не силен в Regex, но do_shortcode в основном не обрабатывает никакие шорткоды в атрибутах, это может вам помочь:

add_filter('the_content', function($c){
    $pattern = '/<span\s*(.*?)data-value=["\']?\[(.*?)\]["\']?\s*(.*?)>\s*(.*?)\s*<\/span>/si';
    $c = preg_replace_callback($pattern, function($c){
        return isset( $c[2] ) ? str_replace(
            $c[2],
            do_shortcode("[{$c[2]}]"),
            $c[0]
        ) : array_pop($c);
    }, $c);
    return $c;
});

Я понимаю, что эта тема с января, но я просто хотел кратко указать, что, как задокументировано в кодексе, шорткоды разрешены внутри HTML-атрибутов.

https://codex.wordpress.org/Shortcode_API#HTML

Это не совсем то, что вы спрашиваете, но, возможно, это поможет найти решение

/* это имитирует ваш шорткод [sola_testimonials_count type="all"] */
function num_sc( $atts ) { return '5,205'; }
add_shortcode( 'num', 'num_sc' );

/* используйте так [test]...[/test], чтобы получить <span data-value="5,205">...</span> */
function test_sc( $atts, $content = null ) {
    remove_filter( 'the_content', 'wpautop' );
    $content = apply_filters( 'the_content', '<span data-value="[num]">' . $content . '</span>' );
    add_filter( 'the_content', 'wpautop' );
    return $content;
}
add_shortcode( 'test', 'test_sc' );

Результат

/* ВВОД */
AAA [test]это тест[/test] BBB
/* ВЫХОД HTML */
AAA <span data-value="5,205">это тест</span> BBB

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

function parse_shortcode_for_attribute($atts) {
    // Извлечение атрибутов шорткода
    $atts = shortcode_atts(
        array(
            'type' => 'all', // Значение по умолчанию, если не указано
        ),
        $atts,
        'sola_testimonials_count' // Имя шорткода
    );

    // Вызвать функцию, которая генерирует вывод шорткода
    $output = sola_testimonials_count_shortcode_function($atts);

    // Экранировать HTML-сущности, чтобы предотвратить XSS-атаки
    $output = esc_attr($output);

    // Вернуть разобранный вывод шорткода как значение атрибута
    return $output;
}
add_shortcode('parse_shortcode_for_attribute', 'parse_shortcode_for_attribute');

вы можете использовать шорткод с шорткодом parse_shortcode_for_attribute так

<span data-value="[parse_shortcode_for_attribute type='all']"></span>

Это разобьет шорткод sola_testimonials_count и установит его вывод как значение атрибута data-value. Убедитесь, что вы заменили sola_testimonials_count_shortcode_function фактической функцией, которая генерирует вывод для шорткода sola_testimonials_count

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

Использование вывода шорткода в качестве значения атрибута HTML может вызывать определённые трудности, особенно в WordPress, где шорткоды обычно обрабатываются только в контенте постов и страниц. Давайте рассмотрим, как вы можете достичь этого, используя код PHP.

Проблема

Вы рассматриваете использование шорткода, например, [sola_testimonials_count type="all"], для заполнения значения атрибута, такого как data-value в HTML. Когда вы размещаете его как обычный контент, шорткод обрабатывается корректно:

<span>[sola_testimonials_count type="all"]</span>

Результат будет:

<span>5,205</span>

Однако, когда вы пытаетесь использовать его внутри атрибута:

<span data-value="[sola_testimonials_count type='all']"></span>

Вывод остаётся неизменным, так как WordPress не обрабатывает шорткоды внутри атрибутов.

Решение

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

Пример реализации

  1. Сначала создайте функцию для обработки вашего шорткода.
// Функция обработки шорткода
function sola_testimonials_count_shortcode_function($atts) {
    // Ваш код, который возвращает вывод шорткода
    return '5,205'; // Пример возвращаемого значения
}

function parse_shortcode_for_attribute($atts) {
    // Извлечение атрибутов шорткода
    $atts = shortcode_atts(array('type' => 'all'), $atts, 'sola_testimonials_count'); 

    // Вызов функции, генерирующей вывод шорткода
    $output = sola_testimonials_count_shortcode_function($atts);

    // Экранирование для безопасности
    return esc_attr($output);
}

// Регистрация нового шорткода
add_shortcode('parse_shortcode_for_attribute', 'parse_shortcode_for_attribute');
  1. Теперь вы можете использовать новый шорткод:
<span data-value="[parse_shortcode_for_attribute type='all']"></span>

Пояснение

  • Функция sola_testimonials_count_shortcode_function: это функция, которая генерирует вывод для вашего шорткода. Замените примерное значение на реальный код генерации данных.
  • Экранирование: функция esc_attr() гарантирует, что вывод безопасен для применения в HTML, предотвращая потенциальные ошибки и уязвимости, такие как XSS (межсайтовый скриптинг).
  • Шорткод parse_shortcode_for_attribute: создаёт новый шорткод, который вы можете использовать в своих HTML-элементах.

Заключение

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

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

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