web-dev-qa-db-fra.com

Exécuter le shortcode avant les filtres

Mes utilisateurs postent des extraits de code dans des commentaires. J'ai créé un shortcode pour cela:

function post_codigo($atts,$content=""){

        return '<code>'.$content.'</code>';
}

add_shortcode('codigo','post_codigo');  

Le problème est que le HTML est filtré avant d’être inséré dans les balises de code.

Je pense que si je peux obtenir le shortcode exécuté avant les filtres, alors je peux utiliser

function pre_esc_html($content) {
  return preg_replace_callback(
    '#(<code.*?>)(.*?)(</code>)#imsu',
    create_function(
      '$i',
      'return $i[1].esc_html($i[2]).$i[3];'
    ),
    $content
  );
}

add_filter(
  'the_content',
  'pre_esc_html',
  9
);

que j'ai trouvé par ici. Ce que tu penses?

MISE À JOUR: Ok maintenant j'ai changé mon shortcode en:

 function post_codigo($atts,$content=""){

            return '<code>'.esc_html($content).'</code>';
    }

    add_shortcode('codigo','post_codigo');

Mais il ajoute encore

casse et déchire tout le code en plusieurs balises

3
chifliiiii

Vous pouvez filtrer le tableau $ no_texturize_shortcodes , qui est une collection de codes courts exclus de wptexturize. Si vous faites cela, tout ce qui se trouve dans les balises [codigo] shortcode ne sera pas texturé:

add_filter( 'no_texturize_shortcodes', 'no_texturize_codigo_shortcode' );

function no_texturize_codigo_shortcode( $excluded_shortcodes ) {
    $excluded_shortcodes[] = 'codigo';
    return $excluded_shortcodes;
}
3
goldenapples

Le filtre no_texturize_shortcodes n'a rien fait pour moi, car le contenu du shortcode aurait déjà été filtré par wpautop() et tous les autres filtres liés au the_content. J'ai eu recours à la modification de l'ordre de filtrage de do_shortcode par rapport à the_content, afin de pouvoir être certain qu'il fonctionne en premier. Voici comment:

remove_filter('the_content', 'do_shortcode', 11); // AFTER wpautop()
add_filter('the_content', 'do_shortcode', 9); // BEFORE wpautop()

Cela semble fonctionner assez bien, mais comme il s’agit d’une modification assez importante de la manière dont WordPress traite sa conversion texte/html, je vous recommande de l’utiliser avec prudence. Plus vous utilisez de plugins/shortcodes, plus vous risquez de rencontrer des problèmes liés à ce changement.

1
Simon

Votre thème utilise-t-il comment_text() pour afficher les commentaires de vos visiteurs?

si oui, essayez de changer:

<?php comment_text(); ?>

à:

<?php echo do_shortcode(apply_filters('comment_text', get_comment_text())); ?>

Cela appliquera tous les filtres "comment_text" au texte du commentaire avant , le shortcode sera appliqué.

Cela devrait être fait dans vos modèles de thème partout où les commentaires sont affichés.

0
sxalexander

Vous devriez utiliser des caractères html?

return '&lt;code&gt;'.$content.'&lt;/code&gt;';

.
J'ai essayé cette localy et ça marche gr8

0
Sagive SEO