web-dev-qa-db-fra.com

Comment puis-je ajouter à la liste blanche uniquement des codes courts spécifiques pour le traitement dans des widgets de texte?

Je sais que je peux utiliser les filtres suivants pour activer le traitement des codes courts dans les widgets de texte:

add_filter( 'widget_text', 'shortcode_unautop');
add_filter( 'widget_text', 'do_shortcode');

Comment puis-je seulement ajouter à la liste blanche quelques codes abrégés spécifiques à traiter, mais pas uniquement traiter chaque code abrégé?

3
MadtownLems
add_filter( 'widget_text', 'wpse_137725_shortcode_whitelist' );

/**
 * Apply only whitelisted shortcode to content.
 * 
 * @link http://wordpress.stackexchange.com/q/137725/1685
 * 
 * @param   string  $text
 * @return  string
 */ 
function wpse_137725_shortcode_whitelist( $text ) {
    static $whitelist = array(
        'gallery',
        'form',
    );

    global $shortcode_tags;

    // Store original copy of registered tags.
    $_shortcode_tags = $shortcode_tags;

    // Remove any tags not in whitelist.
    foreach ( $shortcode_tags as $tag => $function ) {
        if ( ! in_array( $tag, $whitelist ) )
            unset( $shortcode_tags[ $tag ] );
    }

    // Apply shortcode.
    $text = shortcode_unautop( $text );
    $text = do_shortcode( $text );

    // Restore tags.
    $shortcode_tags = $_shortcode_tags;

    return $text;
}
3
TheDeadMedic

Ou un peu plus simple.

function do_shortcode_only_for($content, $tagnames) {
  $pattern = get_shortcode_regex($tagnames);
  $content = preg_replace_callback("/$pattern/", 'do_shortcode_tag', $content);
  return $content;
}

Tiré de la fonction originale do_shortcode .

1
pravdomil