web-dev-qa-db-fra.com

Quels sont les caractères autorisés en tant que balises shortcode et comment doivent-ils être nettoyés?

Je travaille sur un plugin où l'utilisateur peut définir lui-même les balises shortcode. Que suggéreriez-vous d'autoriser? Ma pensée est seulement autoriser les caractères ascii.

Alors, comment puis-je désinfecter? strip_tags puis regex pour autoriser uniquement a-z, 0-9 ou existe-t-il une meilleure solution? WordPress a-t-il un filtre pour cela? Puis-je utiliser le filtre utilisé par WordPress pour les slugs?

merci pour les réponses, je vais simplement faire ceci, s'il doit y avoir un caractère ascii de toute façon, alors j'en ai juste besoin de trois.

foreach ( $shortcodes as $key => $var ) {

$var = preg_replace('/[^a-z0-9_]/', '', $var ); // strip away everything except a-z,0-9 underscore

if ( strlen($var) < 3 )
    continue; // if less then 3 chars AFTER the strip don't save
5
amy

Vous pouvez utiliser presque tous les personnages. Juste le caractère / est dangereux. Ne le permets pas. WordPress utilise preg_quote pour échapper au nom de shortcode, mais n'inclut pas son propre délimiteur de regex / pour ce faire. Donc, le shortcode ne sera pas échappé correctement et vous recevrez un avertissement PHP.

De plus, il n'y a que deux règles de base pour un nom de shortcode:

  1. Il devrait y avoir au moins deux caractères.
  2. Il doit contenir au moins un caractère US-ASCII (a-z0-9).

Donc ça marche:

foreach ( array ( '.-o', ']b', 'äoß', 'o"o', "o'o", '❤m' ) as $shortcode )
{
    add_shortcode( $shortcode, 't5_crazy_shortcode_handler' );
}

function t5_crazy_shortcode_handler( $attrs = array(), $content = NULL, $shortcode )
{
    return "<pre>\$shortcode: $shortcode\n\n\$attrs\n"
        . htmlspecialchars( print_r( $attrs, TRUE ) )
        . "\n\n\$content"
        . htmlspecialchars( print_r( $content, TRUE ) )
        . '</pre>';
}
1
fuxia

Il semble que WordPress ait quelques problèmes avec les balises shortcodes qui ont des traits d'union , donc vous voulez probablement l'éviter. Vous ne savez pas s'il s'agit toujours d'un problème avec WP 3.3.x.

La plupart des fonctions de "nettoyage" dans le fichier wp-includes/formating.php de WP (comme sanitize_title) fonctionnent de la même manière que ce dont vous pourriez avoir besoin, mais elles autorisent les traits d'union. Si vous souhaitez uniquement renvoyer des caractères alphanumériques, et non des traits d'union, il est probablement préférable d'écrire une fonction qui prend une chaîne, utilise preg_replace pour supprimer des espaces et uniquement alphanumérique. Vous pouvez remplacer les espaces par des traits de soulignement, car il ne semble pas que l'API Shortcode présente des problèmes avec ceux des balises shortcode.

3
Jeremy