web-dev-qa-db-fra.com

Shortcode renvoie les balises HTML échappées

Pour mettre les choses en contexte, j'utilise Gantry sur WordPress, qui est fourni avec Timber et Twig.

J'ai ce code, de base, make-your-text-bold shortcode

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

et puis dans ma particule de brindille,

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

le résultat attendu serait texte en gras , n'est-ce pas?

ou en termes HTML

<strong>bold text</strong>

mais ce que je reçois, c'est

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

J'ai lu des codes courts sur le codex wordpress , des instructions sur les codes courts pour le bois , Twig d'échappement , utilisé les fonctions php

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

et une combinaison des deux , mais pas de dés.

Je suis à bout de forces. Je ne peux pas savoir où se passe l'évasion. Fait un compte pour cela. Toute aide est grandement appréciée.

1
Kevin

Je vous recommande d'utiliser des guillemets simples si vous souhaitez inclure du code HTML. Vous devez également renvoyer un élément, sinon rien ne se produit.

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

Votre shortcode WordPress serait:

[bold-text]

Edit: Vous n'avez pas besoin de html_entity_decode ou htmlentities uniquement lorsque vous faites quelque chose de très complexe ou lorsque vous souhaitez générer du HTML.

Le rameau d'extension Escaper
Vous utilisez Twig, vous devez donc vérifier si vous avez activé le mode d'échappement quelque part.

Escaper Extension

L'extension escaper ajoute une sortie automatique à Twig. Il définit une balise, autoescape, et un filtre, raw.
Lors de la création de l’extension escaper, vous pouvez activer ou désactiver la stratégie d’échappement de sortie globale:

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


Si défini sur html, toutes les variables des modèles sont échappées (à l'aide de la stratégie d'échappement html), à l'exception de celles utilisant le filtre brut:

{{ article.to_html|raw }}


Vous pouvez également modifier le mode d'échappement localement à l'aide de la balise autoescape:

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

S'il te plaît, supporte-moi, je n'utilise pas Twig, je ne peux donc que te guider. Donc, dans votre cas, vous devez faire quelque chose comme ceci:

{% 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 %}

Éditer 2:
Voir aussi la citation WP PHP Normes de codage ci-dessous et voir le lien: https://make.wordpress.org/core/handbook/best-practices/coding -normes/php/

Citations simples et doubles #

Citations simples et doubles Utilisez des guillemets simples et doubles, le cas échéant. Si vous n’évaluez rien dans la chaîne, utilisez des guillemets simples. Vous ne devriez presque jamais avoir à échapper des guillemets dans une chaîne, car vous pouvez simplement alterner votre style de citation, comme ceci:

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

Le texte qui entre dans les attributs doit être passé par esc_attr() afin que les guillemets simples ou doubles ne mettent pas fin à la valeur de l'attribut, n'invalident pas le code HTML et ne causent pas de problème de sécurité. Voir Validation des données dans le Codex pour plus de détails.

0
Remzi Cavdar