Как использовать шорткоды внутри HTML-тегов?

5 окт. 2016 г., 17:38:55
Просмотры: 55K
Голосов: 5

Я пытался включить шорткоды с параметром в вывод чистого HTML, как показано ниже:

<a href="https://example.com/folder/edit.php?action=someaction&id=[foocode parameter='value']&edittoken=[foocode parameter='othervalue']">текст ссылки</a>

Это приводит к сбою PHP функции do_shortcode().

Действительно ли такое невозможно сделать с шорткодами?

Само описание метода содержит предупреждение:

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

Однако, сбой PHP - это не тот тип неожиданного вывода, который должен происходить.

PS: Вызываемая функция выглядит так:

function echocode( $atts ){
    return "Привет, мир";
}

и добавляется как

add_shortcode("foocode", "echocode");

Функция никогда не запускается. (Начальный echocode не выводится)

2
Комментарии

Функция обратного вызова шорткода не должна использовать echo, она должна возвращать строку.

fuxia fuxia
5 окт. 2016 г. 18:07:16

Даже без использования echo и при возврате методом просто "", он всё равно вызывает ошибку.

ApolloLV ApolloLV
5 окт. 2016 г. 18:20:10
Все ответы на вопрос 5
4

шорткоды не разрешены в HTML атрибутах, шорткоды — это не язык программирования, а заполнители для корректного HTML-контента.

5 окт. 2016 г. 18:18:48
Комментарии

На самом деле они разрешены, так как у метода есть переключатель, игнорировать ли шорткоды внутри HTML-тегов или нет. Если бы они не были разрешены, метод должен был бы игнорировать все шорткоды внутри HTML-тегов ради стабильности.

ApolloLV ApolloLV
5 окт. 2016 г. 18:24:04

Если ты эксперт, то зачем спрашиваешь? :( Они не разрешены, точка. Ты можешь написать свой собственный парсер контента, используя любой API, но если ты когда-нибудь захочешь, чтобы пользователи реально им пользовались, это приведёт к ошибкам. Это фича релиза 4.3 или 4.4, до этого это было возможно, но было изменено из-за "злоупотреблений", подобных тем, что ты показал в своём коде. Ты можешь заставить это работать, но это не поддерживается ядром, поэтому ты никогда не узнаешь, когда твоё решение перестанет работать.

Mark Kaplun Mark Kaplun
5 окт. 2016 г. 18:28:38

Спасибо, именно такое объяснение я и хотел услышать :D

ApolloLV ApolloLV
5 окт. 2016 г. 18:50:01

рад помочь, не принимай мою ворчливость близко к сердцу ;)

Mark Kaplun Mark Kaplun
5 окт. 2016 г. 18:52:49
0

Надеюсь, это кому-то поможет:

Вместо того чтобы писать так: <a href="https://example.com/folder/edit.php?action=someaction&id=[foocode parameter='value']&edittoken=[foocode parameter='othervalue']">linktext</a>

Можно сделать так: [foocode parameter1=value parameter2=othervalue], а затем добавить:

add_shortcode( 'foocode', 'prefix_foocode' );

function prefix_foocode( $atts ) {

    // Нормализация $atts, установка значений по умолчанию и любые другие манипуляции с $atts.

    $html = '<a href="https://example.com/folder/edit.php?action=someaction&id=' . $atts['parameter1'] .'&edittoken=' . $atts['parameter2'] . '">linktext</a>';
return $html;
}
18 мар. 2017 г. 23:59:22
2

Насколько это важно, шорткоды, которые не принимают параметры, похоже, работают внутри HTML-тегов. А те, у которых есть параметры — нет.

Пример: <a href="https://example.com/folder/edit.php?action=someaction&id=[foocode parameter='value']&edittoken=[foocode parameter='othervalue']">текст ссылки</a> не работает

Пример: <a href="https://example.com/folder/edit.php?action=someaction&id=[foocode]&edittoken=[foo-other-code]">текст ссылки</a> работает (по крайней мере у меня)

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

Надеюсь, это поможет тем, кто столкнётся с этим вопросом в будущем.

9 июл. 2017 г. 16:13:14
Комментарии

Похоже, что использование одинаковых кавычек для HTML-атрибута и атрибутов шорткода создаёт проблемы. <a href="[mytest attribute='1234']">test</a> работает, как и <a href="[mytest attribute=1234]">test</a> или <a href='[mytest attribute="1234"]'>test</a>.

janh janh
30 янв. 2018 г. 10:57:08

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

Crazycoolcam Crazycoolcam
30 янв. 2018 г. 14:55:06
2

Попробуйте это:

<a href="https://example.com/folder/edit.php?action=someaction&id=<?php echo do_shortcode("[foocode parameter='value']"); ?>&edittoken=<?php echo do_shortcode("[foocode parameter='othervalue']"); ?>">текст ссылки</a>
5 окт. 2016 г. 19:40:11
Комментарии

Это может сработать, если добавить код в файл или функцию (function.php, шаблон и т.д.), но не будет работать, если добавить код в редактор TinyMCE, так как PHP там автоматически удаляется.

Ian Ian
19 мар. 2017 г. 06:37:56

@Ian именно - смысл шорткодов в том, чтобы позволить конечным пользователям (редакторам) добавлять динамический контент в редакторе; использование php полностью противоречит этой цели.

Peter Kionga-Kamau Peter Kionga-Kamau
27 дек. 2018 г. 20:56:04
0

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

Например, если ваш шорткод [foo_code], то определите, какая функция вызывается при выполнении этого шорткода, найдя add_shortcode() для него (в данном случае [foo_code]):

add_shortcode('foo_code', 'foo_callback_function');

Теперь, когда вы знаете, какая функция вызывается, вы можете просто вывести её в сыром HTML, например:

[echo foo_callback_function();]

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

18 мар. 2018 г. 18:48:42