web-dev-qa-db-ja.com

ショートコードはエスケープされたHTMLタグを返します

状況を把握するために、TimberとTwigにバンドルされているWordPressでGantryを使用しています。

私はこのコードを持っています、基本的な、make-your-text-bold shortcode

// 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;

私は ワードプレスコーデックスのショートコードを読んだ木材のショートコードの使い方小枝のエスケープ

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

そして 両方の組み合わせ 、しかしサイコロではない。

私は私の機知にとどまっています。脱出がどこで起こっているのか私にはわかりません。これを説明しました。任意の助けは大歓迎です。

1
Kevin

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_decodehtmlentitiesを必要としないのは、非常に複雑なことをしているときや、HTMLを出力したいときだけです。

Escaper Extension Twig
あなたはTwigを使っているので、どこかでエスケープモードを有効にしたかどうかをチェックする必要があります。

エスケープエクステンション

Escaperエクステンションは自動出力をTwigにエスケープします。タグautoescapeとフィルタrawを定義します。
エスケープ拡張子を作成するときに、グローバル出力エスケープ戦略をオンまたはオフに切り替えることができます。

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


htmlに設定すると、生のフィルタを使用するものを除いて、テンプレート内のすべての変数は(htmlエスケープ戦略を使用して)エスケープされます。

{{ 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:
下記のquote WP PHPコーディング標準も参照してください。リンク: https://make.wordpress.org/core/handbook/best-practices/codingも参照してください。標準/ php/

一重引用符と二重引用符

一重引用符と二重引用符適切な場合は、一重引用符と二重引用符を使用してください。文字列内の何も評価しない場合は、一重引用符を使用してください。あなたは、文字列の中の引用符をエスケープする必要はほとんどないはずです。なぜなら、引用スタイルを変えることができるからです。

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

一重引用符または二重引用符が属性値を終了させず、HTMLを無効にしてセキュリティー上の問題を引き起こすことがないように、属性に入るテキストはesc_attr()を介して実行する必要があります。詳細については、コーデックスのデータ検証を参照してください。

0
Remzi Cavdar