Quel est le moyen idéal pour enregistrer / mettre en file d'attente des scripts et / ou des styles à utiliser dans des plugins?
J'ai récemment créé un plugin simple permettant d'ajouter l'avatar / gravatar de l'utilisateur avec un shortcode. J'ai différentes options de style pour afficher l'avatar (carré, rond, etc.) et j'ai décidé de mettre le css directement dans le shortcode lui-même.
Cependant, je réalise maintenant que ce n’est pas une bonne approche car il répète le css chaque fois que le shortcode est utilisé sur une page. J'ai vu plusieurs autres approches sur ce site et le codex wp en a même deux exemples. Il est donc difficile de savoir quelle approche est la plus cohérente et la plus rapide.
Voici les méthodes que je connais actuellement:
Méthode 1: Inclure directement dans le shortcode - C'est ce que je suis en train de faire dans le plug-in, mais cela ne semble pas bien car cela répète du code.
class My_Shortcode {
function handle_shortcode( $atts, $content="" ) {
/* simply enqueue or print the scripts/styles in the shortcode itself */
?>
<style type="text/css">
</style>
<?php
return "$content";
}
}
add_shortcode( 'myshortcode', array( 'My_Shortcode', 'handle_shortcode' ) );
Méthode 2: Utiliser la classe pour la mise en file d'attente des scripts ou des styles de manière conditionnelle
class My_Shortcode {
static $add_script;
static function init() {
add_shortcode('myshortcode', array(__CLASS__, 'handle_shortcode'));
add_action('init', array(__CLASS__, 'register_script'));
add_action('wp_footer', array(__CLASS__, 'print_script'));
}
static function handle_shortcode($atts) {
self::$add_script = true;
// shortcode handling here
}
static function register_script() {
wp_register_script('my-script', plugins_url('my-script.js', __FILE__), array('jquery'), '1.0', true);
}
static function print_script() {
if ( ! self::$add_script )
return;
wp_print_scripts('my-script');
}
}
My_Shortcode::init();
Méthode 3: Utiliser get_shortcode_regex();
function your_prefix_detect_shortcode() {
global $wp_query;
$posts = $wp_query->posts;
$pattern = get_shortcode_regex();
foreach ($posts as $post){
if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
&& array_key_exists( 2, $matches )
&& in_array( 'myshortcode', $matches[2] ) )
{
// css/js
break;
}
}
}
add_action( 'wp', 'your_prefix_detect_shortcode' );
Méthode 4: Utiliser has_shortcode();
function custom_shortcode_scripts() {
global $post;
if( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'myshortcode') ) {
wp_enqueue_script( 'my-script');
}
}
add_action( 'wp_enqueue_scripts', 'custom_shortcode_scripts');
Method 4: Using has_shortcode();
c'est mieux car cela garantira que les scripts et les styles seront chargés une seule fois si le contenu de la publication comporte un shortcode, indépendamment de ses multiples utilisations. Bien que cela puisse ne pas fonctionner pour les utilisations de shortcode dans les widgets ou dans la barre latérale, je ne suis pas certain. Si c'est pour un plugin, alors je ne vous recommanderais pas de lier les scripts avec shortcode car certains pourraient appeler votre fonction au lieu de shortcode pour obtenir le résultat souhaité.