¿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.Respuestas:
Encontré otra forma que me funciona bien:
Al inicializar el complemento, no ponga en cola sus scripts y estilos, sino regístrelos con
wp_register_style
ywp_register_script
.A continuación, puede cargar el script / estilo a pedido. Por ejemplo, cuando representa un shortcode con
wp_enqueue_style("your_style")
ywp_enqueue_script("your_script")
.Aquí hay un complemento de ejemplo que usa este método que le permite usar get_avatar como shortcode. La hoja de estilo solo se coloca en cola cuando el shortcode está presente.
Uso (el ID predeterminado es el usuario actual):
[get_avatar id="" size="32" default="mystery" alt="Profile Photo" class="round"]
fuente
wp_enqueue_scripts
enlace ya haya ocurrido. (Los códigos cortos se analizan durante elthe_content
cual es parte delthe_post
gancho, lo que significa que hacer cola cuando se analiza es demasiado tarde a menos que ya haya registrado el script)Antes de comenzar la respuesta, debo decir que con respecto a este tema, css y js no son lo mismo.
La razón es simple: si bien agregar js al cuerpo de la página (en el pie de página) es una forma común y válida de hacerlo, css debe colocarse en la
<head>
sección de la página: incluso si la mayoría de los navegadores pueden representar correctamente css en la página cuerpo, eso no es un código HTML válido.Cuando se procesa un código corto, la
<head>
sección ya se imprimió, significa que se puede agregar js sin ningún problema en el pie de página, pero css se debe agregar antes de que se procese el código corto.Guiones
Si su shortcode solo necesita js, tiene suerte y solo puede usarlo
wp_enqueue_script
en el cuerpo de la devolución de llamada de shortcode:Al hacerlo, su script se agrega al pie de página y solo una vez, incluso si el shortcode se usa más de una vez en la página.
Estilos
Si el código necesita estilos, entonces debe actuar antes de que se procese el shortcode.
Hay maneras diferentes de hacer esto:
mire todas las publicaciones en la consulta actual y agregue los estilos de shortcode si es necesario. Esto es lo que haces en el método # 3 y # 4 en OP. De hecho, ambos métodos hacen lo mismo, pero
has_shortcode
se agregó en WP 3.6, mientrasget_shortcode_regex
está disponible desde la versión 2.5, por lo tanto, úseloget_shortcode_regex
solo si desea que su complemento sea compatible con versiones anteriores.siempre agregue estilo shortcode, en todas las páginas
Cuestiones
El problema con el n. ° 1 es el rendimiento. Las expresiones regulares son operaciones bastante lentas y el lanzamiento de expresiones regulares en un bucle de todas las publicaciones puede ralentizar la página de manera consistente. Además, es una tarea bastante común en los temas mostrar solo el extracto de la publicación en los archivos y mostrar el contenido completo con códigos cortos solo en vistas singulares. Si eso sucede, cuando se muestra un archivo, su complemento lanzará una coincidencia de expresiones regulares en un bucle con el objetivo de agregar un estilo que nunca se utilizará: un impacto innecesario en el doble rendimiento: ralentizar la generación de páginas + solicitud HTTP adicional innecesaria
El problema con el n. ° 2 es el rendimiento, nuevamente. Agregar estilo a todas las páginas significa agregar una solicitud HTTP adicional para todas las páginas, incluso cuando no sea necesario. Incluso si el tiempo de generación de la página del lado del servidor no se ve afectado, el tiempo total de representación de la página lo hará, y para todas las páginas del sitio.
Entonces, ¿qué debe hacer un desarrollador de complementos?
Creo que lo mejor es agregar una página de opciones al complemento, donde los usuarios pueden elegir si el shortcode debe manejarse solo en vista singular o incluso en archivos. En ambos casos, es mejor proporcionar otra opción para elegir qué tipos de publicaciones habilitan shortcode.
De esa manera es posible enganchar
"template_redirect"
para verificar si la consulta actual satisface los requisitos y, en ese caso, agregar el estilo.Si el usuario elige usar shortcode solo en vistas de publicaciones singulares, es una buena idea verificar si la publicación tiene shortcode o no: una vez que solo se requiere una expresión regular, no debería ralentizar tanto la página.
Si el usuario elige usar shortcode incluso en archivos, evitaría ejecutar regex para todas las publicaciones si el número de publicaciones es alto y simplemente pondría en cola el estilo si los requisitos de la consulta se ajustaran.
Lo que debe considerarse "alto" a este respecto debe ser utilizar algunas pruebas de rendimiento o, como alternativa, agregar otra opción y dar la opción a los usuarios.
fuente
<style>
etiquetas en el cuerpo del documento ahora son válidas según las especificaciones del W3C. w3.org/TR/html52/document-metadata.html#the-style-elementPara mi complemento, descubrí que a veces los usuarios tienen un generador de temas que tiene un código abreviado almacenado en metadatos posteriores . Esto es lo que estoy usando para detectar si mi código abreviado del complemento está presente en la publicación actual o en los metadatos de la publicación :
fuente
Lo hago asi:
y atrapar hook en otras funciones (u otros complementos):
fuente
Descubrí mi propio complemento, si el shortcode está presente en el widget de texto.
fuente
WordPress tiene una función incorporada para hacer algo basado en un estado de presentación Shortcode específico. El nombre de la función es
has_shortcode()
. Puedes usar el siguiente código para poner en cola tu estilo y tus scripts.Aquí usé
is_a( $post, 'WP_Post' )
para verificar si el$post
objeto es de laWP_Post
clase y solía$post->post_content
verificar el contenido de la publicación.fuente
Hice una combinación del código de ejemplo de la página de Wordpress para has_shortcode () y la respuesta que dio zndencka . Me di cuenta de que la función has_shortcode se agrega en Wordpress 3.6, por eso primero compruebo si la función existe. Tal vez esa verificación es un poco obsoleta, ya que ya no hay muchos usuarios por debajo de wordpress 3.6 según wordpress sus propias estadísticas.
fuente
De hecho, podemos cargar condicionalmente archivos CSS y JS a través de shortcode sin usar ninguna función demasiado elaborada :
Primero, supongamos que registramos todos nuestros archivos CSS / JS anteriormente (tal vez cuando se
wp_enqueue_scripts
ejecutó)A continuación, examinemos nuestra función de shortcode:
Sencillo. Hecho. Ergo: podemos "cargar condicionalmente" archivos css / js (solo cuando se ejecuta [shortcode]).
Consideremos la siguiente ideología:
prep_css_and_js()
función cargue TODOS los archivos .css / .js que están en ciertas carpetas ...Ahora que WP los ve como scripts registrados, podemos llamarlos, condicionalmente, en función de una serie de situaciones, que incluyen pero no se limitan a
my_shortcode_func()
Beneficios: (sin MySQL, sin funciones avanzadas y sin filtros necesarios)
Referencias
fuente