¿Cuál es la forma ideal de registrar / poner en cola secuencias de comandos y / o estilos para usar en complementos?
Recientemente hice un complemento simple para agregar al usuario avatar / gravatar con un código corto. Tengo diferentes opciones de estilo para mostrar el avatar (cuadrado, redondo, etc.) y decidí poner el CSS directamente en el código corto.
Sin embargo, ahora me doy cuenta de que este no es un buen enfoque, ya que repetirá el CSS cada vez que se use el shortcode en una página. He visto varios otros enfoques en este sitio y el wx codex incluso tiene dos ejemplos propios, por lo que es difícil saber qué enfoque es más consistente y rápido.
Estos son los métodos que conozco actualmente:
Método 1: Incluir directamente en shortcode: esto es lo que estoy haciendo actualmente en el complemento, pero no parece bueno ya que repite el código.
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étodo 2: utilice la clase para poner en cola secuencias de comandos o estilos condicionalmente
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étodo 3: usar 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étodo 4: usar 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();
es mejor porque garantizará que las secuencias de comandos y los estilos se carguen una vez si el contenido de la publicación tiene código corto, independientemente de los múltiples usos del código corto. Aunque podría no funcionar para usos de shortcode en widgets o en la barra lateral, no estoy seguro. Si se trata de un complemento, no recomendaría que vincule los scripts con shortcode porque algunos podrían llamar a su función en lugar de shortcode para obtener la salida deseada.