Lancé un complemento que crea un código corto y requiere un archivo JavaScript y un archivo CSS para cargar en cualquier página que contenga ese código corto. Podría hacer que el script / estilo se cargue en todas las páginas, pero esa no es la mejor práctica. Solo quiero cargar los archivos en páginas que llaman al shortcode. He encontrado dos métodos para hacer esto, pero ambos tienen problemas.
El método 1 establece un indicador en verdadero dentro de la función del controlador de shortcode y luego verifica ese valor dentro de una wp_footer
devolución de llamada. Si es cierto, se usa wp_print_scripts()
para cargar el JavaScript. El problema con esto es que solo funciona para JavaScript y no CSS, porque CSS debe declararse dentro <head>
, lo que solo puede hacer durante un gancho temprano como init
o wp_head
.
El método 2 se dispara temprano y "mira hacia adelante" para ver si el shortcode existe en el contenido de la página actual. Me gusta este método mucho mejor que el primero, pero el problema con él no detectará si la plantilla llama do_shortcode()
.
Por lo tanto, me estoy inclinando hacia el uso del segundo método y luego trato de detectar si se asigna una plantilla y, de ser así, analizarla para el shortcode. Sin embargo, antes de hacer eso, quería comprobar si alguien sabe de un método mejor.
Actualización: he integrado la solución en mi complemento. Si alguien tiene curiosidad por verlo desarrollado en un entorno en vivo, puede descargarlo o navegarlo .
Actualización 2: a partir de WordPress 3.3, ahora es posible llamar wp_enqueue_script()
directamente dentro de una devolución de llamada de código corto , y el archivo JavaScript se llamará dentro del pie de página del documento. Eso también es técnicamente posible para los archivos CSS, pero debe considerarse una mala práctica porque la salida de CSS fuera de la <head>
etiqueta viola las especificaciones del W3C, puede encerrar FOUC y puede forzar al navegador a volver a representar la página.
Respuestas:
Según mi propia experiencia, he usado una combinación de los métodos 1 y 2: la arquitectura y los scripts de pie de página de 1, y la técnica de "anticipación" de 2.
Sin embargo, para el futuro, uso regex en lugar de
stripos
; preferencia personal, más rápido y puede verificar el shortcode 'malformado';Si le preocupa que los autores lo usen
do_shortcode
manualmente, optaría por indicarles queusen una llamada a la acción para poner encola su estilo previamente registrado manualmente.ACTUALIZACIÓN : Para el autor perezoso que nunca RTFM, envía un mensaje para resaltar el error de sus formas;)
fuente
do_shortcode()
, ¿no es razonable suponer que también son expertos en seguir las instrucciones para crear el estilo shortcode?init
, solo en cualquier lugar anteswp_head
. Para el desarrollador perezoso, verifiquewp_style_is( 'my_style_handle', 'done' )
dentro de su shortcode. Si es falso, imprima un error visible que les indique qué hacer.do_shortcode()
a la plantilla ya era "hacer [algo] extra", y los usuarios que harían algo extra ya sabrían sobre la necesidad de crear el estilo, o de lo contrario estarían más dispuestos / probablemente seguir instrucciones especiales.Llegué tarde a responder esta pregunta, pero desde que Ian comenzó este hilo en la lista de wp-hackers hoy, me hizo pensar que valía la pena responder, especialmente teniendo en cuenta que he estado planeando agregar esa característica a algunos complementos en los que he estado trabajando.
Un enfoque a considerar es verificar la carga de la primera página para ver si el shortcode se usa realmente y luego guardar el estado de uso del shortcode en una meta clave. Así es cómo:
Instrucciones paso a paso
$shortcode_used
bandera para'no'
.$shortcode_used
bandera en'yes'
.'the_content'
prioridad de enlace12
que es después de que WordPress haya procesado los códigos cortos y verifique la meta del mensaje para''
usar la clave"_has_{$shortcode_name}_shortcode"
. (Se''
devuelve un valor de cuando no existe una metaclave de publicación para la ID de publicación).'save_post'
gancho para eliminar la metaetiqueta de la publicación, borrando el indicador persistente para esa publicación en caso de que el usuario cambie el uso de shortcode.'save_post'
gancho, usewp_remote_request()
para enviar un HTTP GET sin bloqueo al enlace permanente de la publicación para activar la carga de la primera página y la configuración del indicador persistente.'wp_print_styles'
y verifique el meta meta de la publicación para obtener un valor de'yes'
,'no'
o''
utilizando la clave"_has_{$shortcode_name}_shortcode"
. Si el valor es'no'
no sirva al externo. Si el valor es'yes'
o''
sigue adelante y sirve al externo.Y eso debería hacerlo. He escrito y probado un complemento de ejemplo para mostrar cómo funciona todo esto.
Código de complemento de ejemplo
El complemento se activa en un
[trigger-css]
código corto que establece los<h2>
elementos de la página en blanco sobre rojo para que pueda verlo funcionar fácilmente. Asume uncss
subdirectorio que contiene unstyle.css
archivo con este CSS:Y a continuación se muestra el código en un complemento que funciona:
Capturas de pantalla de ejemplo
Aquí hay una serie de capturas de pantalla
Editor de publicaciones básico, sin contenido
Visualización de publicaciones, sin contenido
Editor de publicaciones básico con
[trigger-css]
shortcodeVisualización de publicaciones con
[trigger-css]
código cortoNo estoy seguro si es 100%
Creo que lo anterior debería funcionar en casi todos los casos, pero como acabo de escribir este código, no puedo estar 100% seguro. Si puede encontrar situaciones en las que no funciona, me gustaría saberlo para poder arreglar el código en algunos complementos a los que acabo de agregar esto. Gracias por adelantado.
fuente
post_content
. ¿Y qué hay de los códigos cortos en widgets?'pre_http_request'
gancho y deshabilitar múltiples llamadas a la misma URL mientras el'save_post'
enganche está activo, pero me gustaría esperar hasta que realmente veamos la necesidad de eso, ¿no? En cuanto a los widgets, podría ser mejorado para manejar, pero no es un caso de uso que he visto todavía.<style>
).Buscar en Google me encontró una respuesta potencial . Digo "potencial" porque se ve bien, debería funcionar, pero no estoy 100% convencido de que sea la mejor manera de hacerlo:
Esto debería poder verificar si la publicación actual está usando un código corto y agregar una hoja de estilo al
<head>
elemento adecuadamente. Pero no creo que funcione para una página de índice (es decir, varias publicaciones en el bucle) ... También es de una publicación de blog de 2 años de antigüedad, por lo que ni siquiera estoy seguro de que funcione con WP 3.1.X .fuente
get_shortcode_regex()
para buscar.do_shortcode()
manualmente en la plantilla, entonces ya sabe que ejecutará el shortcodeUsando una combinación de la respuesta de TheDeadMedic y la documentación de get_shortcode_regex () (que en realidad no encontró mis códigos cortos), creé una función simple utilizada para poner en secuencia los scripts para múltiples códigos cortos. Dado que wp_enqueue_script () en códigos cortos solo se agrega al pie de página, esto puede ser útil ya que puede manejar tanto los scripts de encabezado como de pie de página.
fuente
Finalmente, también encontré una solución para la carga condicional de CSS que funciona para mi plugin www.mapsmarker.com y me gustaría compartirla con ustedes. Comprueba si mi shortcode se usa dentro del archivo de plantilla actual y header / footer.php y, en caso afirmativo, pone en cola la hoja de estilo necesaria en el encabezado:
fuente
Para 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
Para archivos CSS, puede cargarlos dentro de su salida de código corto:
Establezca una constante o algo después de esto, como
MY_CSS_LOADED
(solo incluya el CSS si la constante no está configurada).Ambos métodos son más lentos que ir de esta manera.
Para los archivos JS, puede hacer lo mismo si el script que está cargando es único y no tiene dependencias externas. Si este no es el caso, cárguelo dentro del pie de página, pero use la constante para determinar si necesita cargarse o no ...
fuente
<head>
elemento no es un marcado adecuado. Es cierto que la validación es solo una guía, pero si estamos tratando de cumplir con esa guía, es una mala idea cargar la hoja de estilo dentro de la salida del código corto.<style type="text/css"> The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head"
. Por lo tanto, los estilos en línea (<element style="..."></element>
) son válidos, pero los<style>
elementos en línea no lo son.Script Logic es un complemento de WordPress que le brinda control total sobre todos los archivos JavaScript y CSS. Con este complemento, puede cargar condicionalmente archivos CSS y JS solo en las páginas donde sea necesario.
http://wordpress.org/plugins/script-logic/
fuente