Вопрос или проблема
В пределах элемента 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-атрибутов.
Это не совсем то, что вы спрашиваете, но, возможно, это поможет найти решение
/* это имитирует ваш шорткод [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 не обрабатывает шорткоды внутри атрибутов.
Решение
Чтобы обойти это ограничение, можно использовать специальную функцию, которая будет обрабатывать шорткод и присваивать его результат атрибуту. Давайте создадим шорткод, который будет вызывать нужный вам шорткод и использовать его результат в качестве значения атрибута.
Пример реализации
- Сначала создайте функцию для обработки вашего шорткода.
// Функция обработки шорткода
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');
- Теперь вы можете использовать новый шорткод:
<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, что является полезным заделом для дальнейших разработок.