Как использовать шорткоды внутри HTML-тегов?
Я пытался включить шорткоды с параметром в вывод чистого 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 не выводится)
На самом деле они разрешены, так как у метода есть переключатель, игнорировать ли шорткоды внутри HTML-тегов или нет. Если бы они не были разрешены, метод должен был бы игнорировать все шорткоды внутри HTML-тегов ради стабильности.

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

Надеюсь, это кому-то поможет:
Вместо того чтобы писать так: <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;
}

Насколько это важно, шорткоды, которые не принимают параметры, похоже, работают внутри 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>
работает (по крайней мере у меня)
Я использовал простой шорткод, чтобы выводить путь к изображениям на моём сайте, и мне не нужно запоминать путь каждый раз (я не использую медиабиблиотеку).
Надеюсь, это поможет тем, кто столкнётся с этим вопросом в будущем.

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

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

Для выполнения шорткода внутри элемента с сырым HTML вам нужно найти callback-функцию, которая вызывается через шорткод, а затем вывести эту функцию в сыром HTML-элементе.
Например, если ваш шорткод [foo_code]
, то определите, какая функция вызывается при выполнении этого шорткода, найдя add_shortcode() для него (в данном случае [foo_code]):
add_shortcode('foo_code', 'foo_callback_function');
Теперь, когда вы знаете, какая функция вызывается, вы можете просто вывести её в сыром HTML, например:
[echo foo_callback_function();]
Для более подробной информации о том, почему это работает, ознакомьтесь с этим ответом. Надеюсь, это поможет!
