Carga / descarga de scripts de WordPress - wp_deregister_script ('jquery')

2

Tengo algunas preguntas relacionadas con WordPress que carga / descarga herramientas de javascript. Después de leer una respuesta bien escrita a una pregunta de Pieter Goosen, eso me permitió estudiar un poco y limpiar el código que estoy usando para cargar mis bibliotecas. Este código es del archivo function.php de mi hijo-tema. Tengo algunas funciones en mi sitio que usan las herramientas de calendario del selector de fechas. Además, hay algunos complementos que estoy seguro que usan jQuery.

function jquery_loadup() {
        //wp_deregister_script('jquery');    <--- ?H
        wp_enqueue_script('jquery');
        //wp_enqueue_script('jquery-migrate');
        wp_enqueue_script('jquery-ui-core');
        wp_enqueue_script('jquery-ui-datepicker');
        wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css');
}
add_action('wp_enqueue_scripts','jquery_loadup');

Tenía la impresión de que la línea wp_deregister_script('jquery') esencialmente restablece / borra todas las "solicitudes" anteriores de los scripts de jQuery para que no interfieran entre sí. Esa línea seguida por wp_enqueue_script('jquery'); debería resultar en una carga mínima de jQuery a través del sistema de rutas de manejo / secuencia de comandos de los scripts de uso común de WordPress, ¿no? Pienso que la cancelación de registro de pruebas para detectar la presencia de una 'instalación' anterior para jQuery, y si encuentra una o más, detiene su carga, si no hay ninguna registrada, no haga nada.

Lo que estoy viendo es que cuando uso wp_deregister_script('jquery') obtengo un error en el websie "ReferenceError: jQuery is not defined" . Cuando esto sucede, todas mis funciones de JavaScript fallan. ¿Qué diablos? Cuando se destaca, el sitio funciona bien.

Preguntas: ¿Me estoy perdiendo algo? ¿Qué es lo que no entiendo sobre la llamada de desregistro? ¿Por qué me aparece un mensaje de error?

Nota, la línea que hay para jquery-migrate se supone que es para software que usa versiones anteriores de jQuery. Lo probé, pero no puedo ver que haga nada en mi sitio, así que lo saqué para mejorar los tiempos de descarga y respuesta. Pregunta: ¿Es una mala idea?

referencias:

pregunta zipzit 03.07.2014 - 09:20

2 respuestas

3

Wordpress tiene básicamente dos grupos de métodos para manejar scripts, los cuales deberían usarse:

  • wp_register_script Registra un script en Wordpress. No se llama, solo está disponible para Wordpress, si es necesario.
  • wp_deregister_script es exactamente lo contrario. Borra las definiciones hechas en wp_register_script, el script ya no está disponible como una dependencia o para encolar.

Los scripts registrados no generan nada en el código. Simplemente definen el script mediante programación para que WP pueda reaccionar ante las dependencias y las entradas.

  • wp_enqueue_script realmente define y pone en cola una secuencia de comandos para la salida en el encabezado / pie de página de la página HTML.
  • wp_dequeue_script hace exactamente lo contrario y saca una secuencia de comandos para la salida.

La impresión real ocurre en la acción 'wp_head' o 'wp_footer', dependiendo de los detalles del registro.

Un ejemplo:

wp_deregister_script('jquery');
wp_register_script('jquery', ("https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"), false, '1.9.1', true);

wp_enqueue_script( 'script-1', get_template_directory_uri() . '/js/example1.js', array('jquery'), '1.0.0', false );
wp_enqueue_script( 'script-2', get_template_directory_uri() . '/js/example2.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-3', get_template_directory_uri() . '/js/example3.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-4', get_template_directory_uri() . '/js/example4.js', array('jquery'), '1.0.0', true );
wp_enqueue_script( 'script-5', get_template_directory_uri() . '/js/example5.js', array('jquery'), '1.0.0', true );

En este ejemplo, doy de baja a jQuery. Ya no está disponible y obtendría el mismo error que usted si no lo volviera a registrar. (Esta vez desde el CDN de Google con la esperanza de que acelere mi página).

Pero en la línea tres no se imprimirá jQuery. No aparecerá en ninguna parte. Pero desde la línea cuatro llamo a un montón de scripts, que todos tienen jQuery como una dependencia. El primero reside en el encabezado, todos los demás en el pie de página. Debido a las dependencias, jQuery se pone en cola automáticamente en el encabezado, porque primero se necesita allí.

Entonces, con el sistema de scripts de Wordpress, que es bastante sólido, no hay necesidad de manejar interferencias o solicitudes previas. Los scripts registrados se llaman cuando se necesitan una vez, y solo cuando se necesitan.

En su ejemplo, desregistra el script en la línea 1 de la función y lo vuelve a llamar en la línea 2. Pero debido al desregistro de Wordpress se han olvidado todos los detalles como URL, Versión, dependencias, etc. La función correcta en tu lógica hubiera sido wp_dequeue_script , pero incluso eso no es necesario. Wordpress evalúa la necesidad observando los scripts en cola o las dependencias.

Editar:

  

¿cómo sabe wordpress cómo detener el desastre dejado por 8 complementos diferentes que intentan agregar diferentes versiones de jquery?

La última instancia de registro de jquery antes de la acción wp_print_scripts es la que se imprimió. Eso es esencialmente para lo que es el sistema de prioridad en acciones / filtros.

    
respondido por el Hendrik Luehrsen 03.07.2014 - 10:01
2

Sólo para agregar, en primer lugar, gracias por el complemento, apreciado.

Está utilizando un tema secundario, del cual el tema principal debería tener en cola de la biblioteca jquery integrada en wordpress. Como dije en la publicación a la que se refiere, es una mala práctica, mi énfasis, que cualquier tema principal no ponga en cola el jQuery por defecto.

Tienes un par de problemas con tu código. En primer lugar, nunca cancele el registro de la biblioteca de jquery predeterminada, más adelante se romperán algunas cosas. La forma correcta es sacar la secuencia de comandos usando wp_dequeue_scripts .

Sin embargo, solo una pregunta aquí, ¿por qué necesita retirar la cola y volver a ponerla? Esto suele ser utilizado por los autores de los complementos solo para asegurarse de que jquery no se carga dos veces, el motivo es que los complementos funcionan en todos los temas, por lo que es imposible saber si el tema que un usuario está utilizando con el complemento tiene jquery cargado. Está ejecutando un tema secundario que solo funcionará en ese tema principal específico, por lo que sabrá si el tema principal se ha cargado jQuery. Así que no hay necesidad de sacar la cola y volver a poner en cola.

En segundo lugar, tendrá que mirar la prioridad. add_action tiene 4 parámetros, el tercero es la prioridad ( $priority ). Por lo general, los complementos y los temas secundarios cargan sus scripts después de un tema principal para garantizar que no se sobrepasen más adelante. Por lo tanto, es sabio y una buena práctica ejecutar su acción en el último lugar. Para esto, necesitará una prioridad muy baja, es decir, un número muy alto.

  add_action( 'wp_enqueue_scripts', 'jquery_loadup', 999 );
    
respondido por el Pieter Goosen 03.07.2014 - 10:25

Lea otras preguntas en las etiquetas