Шорткод возвращает экранированные HTML-теги


Чтобы представить ситуацию в контексте, я использую портал на WordPress, который поставляется в комплекте с древесиной и ветками.

У меня есть этот код, базовый, make-your-text-bold короткий код

// Add Shortcode
function bold_text_shortcode( $atts , $content = null ) {
    return '<strong>' . $content . '</strong>';
}
add_shortcode( 'b', 'bold_text_shortcode' );

А затем в моей частице веточки

  {% filter shortcodes %}
  [b] bold text [/b]
  {% endfilter %}

Ожидаемым результатом будет жирный текст , верно?

Или в терминах HTML

<strong>bold text</strong>

Но то, что я получаю, это

&lt;strong&gt; bold text &lt;/strong&gt;

Я прочитал короткие коды в кодексе wordpress, инструкции по шорткодированию древесины, Веточка экранируя, использовал функции php

html_entity_decode("<code>foo and bar@!</code>");
htmlentities("<code>foo and bar@!</code>");

И комбинация обоих , но без костей.

Я в тупике. Я не могу понять, где происходит побег. Сделал для этого учетную запись. Любая помощь будет очень признательна.

Author: Gufran Hasan, 2018-11-12

1 answers

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

// WP Shortcode
function text_shortcode() {
    return '<strong>bold text:</strong> <a href="https://wordpress.stackexchange.com/questions/318934/shortcode-returns-escaped-html-tags">See wordpress.stackexchange.com</a>';
}
add_shortcode('bold-text', 'text_shortcode');

Ваш шорткод WordPress будет следующим:

[bold-text]

Редактировать: Вам не нужны html_entity_decode или htmlentities только тогда, когда вы делаете что-то очень сложное или когда вы хотите вывести какой-то HTML.

Веточка-Удлинитель для Побега
Вы используете Twig, поэтому вам нужно проверить, включен ли у вас режим побега где-то.

Расширение побега

Расширение escaper добавляет автоматическое выходное экранирование в Twig. Он определяет тег, автоэскейп и фильтр raw.
При создании расширения escaper вы можете включить или выключить глобальную стратегию экранирования выходных данных:

$escaper = new Twig_Extension_Escaper('html');
$twig->addExtension($escaper);


Если задано значение html, все переменные в шаблонах экранируются (с использованием стратегии экранирования html), за исключением тех, которые используют фильтр raw:

{{ article.to_html|raw }}


Вы также можно локально изменить режим экранирования с помощью тега autoescape:

{% autoescape 'html' %}
    {{ var }}
    {{ var|raw }}      {# var won't be escaped #}
    {{ var|escape }}   {# var won't be double-escaped #}
{% endautoescape %}

Пожалуйста, потерпите меня, я не использую Прутик, поэтому я мог бы только направлять вас в этом. Итак, в вашем случае вам нужно было бы сделать что-то вроде этого:

{% autoescape %}
    {% set hello = '<strong>Hello</strong>' %}
    {% set hola = '<strong>Hola</strong>' %}

    {{ false ? '<strong>Hola</strong>' : hello|raw }}
    does not render the same as
    {{ false ? hola : hello|raw }}
    but renders the same as
    {{ (false ? hola : hello)|raw }}
{% endautoescape %}

Редактировать 2:
Также смотрите цитату из стандартов кодирования WP PHP ниже и смотрите ссылку: https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/

Одинарные и двойные кавычки #

Одинарные и двойные кавычки Используйте одинарные и двойные кавычки, когда это необходимо. Если вы ничего не оцениваете в строке, используйте одинарные кавычки. Вам почти никогда не придется убегать кавычки в строке, потому что вы можете просто чередовать свой стиль цитирования, например:

echo '<a href="/static/link" title="Yeah yeah!">Link name</a>';
echo "<a href='$link' title='$linktitle'>$linkname</a>";

Текст, который входит в атрибуты, должен быть пропущен через esc_attr() , чтобы одинарные или двойные кавычки не заканчивали значение атрибута , не делали HTML недействительным и не вызывали проблемы с безопасностью. См. Раздел Проверка данных в Кодекс для получения более подробной информации.

 0
Author: Remzi Cavdar, 2018-12-13 06:34:59