Cómo cargar jQuery de WordPress en la sección <head>

25 ago 2013, 19:28:13
Vistas: 33.6K
Votos: 7

En mi blog de WordPress incluí un slideshow basado en javascript en la parte superior que funciona bien. Tengo un archivo PHP que genera el javascript necesario que debe ir en la etiqueta <head> mediante un "add_action" en el archivo functions.php de mi tema hijo:

function add_slideshow_js() {
include('/path/slideshow_output.php');
echo $js_output;
}
add_action( 'wp_head', 'add_slideshow_js' );

El javascript que genera este PHP incluye una llamada al archivo javascript controlador:

<script src="path/slideshow.js" type="text/javascript"></script>

... seguido por el javascript que crea el slideshow de la página.

Todo funciona muy bien y se ve genial. Lo cierto es que depende de jQuery, pero funcionaba bien, así que me pregunté cómo se estaba incluyendo jQuery realmente.

Desactivé todos mis plugins y dejó de funcionar. Así que obviamente uno de ellos estaba incluyendo jQuery y permitiendo que funcionara.

Pero pensé que me gustaría asegurarme de que jQuery esté incluido, sin depender de un plugin, ya que podría eliminar el plugin vital en algún momento en el futuro, y por supuesto, todavía querría que el slideshow funcionara.

Entonces, con todos los plugins desactivados, pensé en incluir jQuery explícitamente yo mismo, escribiendo esta función en el archivo functions.php de mi tema hijo:

function insert_jquery(){
   wp_enqueue_script('jquery');
}
add_filter('wp_head','insert_jquery');

Ahora, eso sí incluye jQuery, pero se carga en el footer, y al experimentar descubrí que el slideshow solo funcionará si jQuery se carga dentro de la etiqueta <head>.

Podría escribir una función para llamar a mi propio archivo jQuery, pero tengo la impresión de que es mejor usar el jQuery incluido con WordPress, y en cualquier caso, pensé que reactivar los plugins haría que jQuery se llamara dos veces.

Entonces, ¿qué función puedo escribir en el archivo functions.php de mi tema hijo que cargará de manera confiable el jQuery de WordPress en la sección <head> de la página?

Espero que todo esto tenga sentido.

0
Todas las respuestas a la pregunta 4
7
12

Por defecto, si encolas jQuery, este se añade en el encabezado (header), pero si algún plugin está cambiando este comportamiento predeterminado y lo está añadiendo en el pie de página (footer) en lugar del encabezado, puedes usar el siguiente código para modificarlo y forzar que se añada de nuevo en el encabezado.

function insert_jquery(){
wp_enqueue_script('jquery', false, array(), false, false);
}
add_filter('wp_enqueue_scripts','insert_jquery',1);

Para más información sobre la función wp_enqueue_script(), visita esta página.

25 ago 2013 20:07:45
Comentarios

Descubro que incluir este código exacto de función en el archivo functions.php de mi tema hijo coloca jquery exitosamente en el <head> nuevamente y así reactiva mi slideshow. Eso es genial, pero sigo desconcertado, ya que parecías implicar que su propósito era evitar que algún plugin 'rebelde' colocara jquery en el footer - pero todos mis plugins están desactivados. Entonces, ¿qué está anulando?

John Doe John Doe
25 ago 2013 20:36:38

Simplemente está añadiendo el script en el header que es necesario para que tu slideshow funcione, pero como algunos de tus plugins lo estaban añadiendo en el footer (ya que puede que alguna funcionalidad de esos plugins necesite este script en el footer) no funcionarán correctamente.

Vinod Dalvi Vinod Dalvi
25 ago 2013 20:41:20

No veo qué puede estar forzando a que jquery se cargue en el footer cuando cada uno de mis plugins está desactivado. ¿Pueden hacer eso mientras están desactivados?

John Doe John Doe
25 ago 2013 20:48:33

No, no hacen eso al desactivar. Intenta cambiar el tema a otro como el tema predeterminado twentytwelve y luego compruébalo.

Vinod Dalvi Vinod Dalvi
25 ago 2013 20:51:11

Cambiar de tema no hace diferencia. Para resumir, con todos los plugins desactivados, un intento de agregar jquery con function insert_jquery(){ wp_enqueue_script('jquery'); } add_filter('wp_head','insert_jquery'); carga jquery en el footer, mientras que usar el código anterior lo carga en la etiqueta <head> como debería hacerlo. No entiendo este comportamiento.

John Doe John Doe
25 ago 2013 22:03:38

Una cosa es que estás usando el hook wp_head en lugar de wp_enqueue_scripts que es el recomendado para agregar scripts, y otra es que el último parámetro de la función wp_enqueue_script() es un booleano que indica si incluirlo en el footer, el cual he establecido en false. Mira esto aquí http://codex.wordpress.org/Function_Reference/wp_enqueue_script

Vinod Dalvi Vinod Dalvi
25 ago 2013 22:16:30

Los scripts deben ser explícitamente desencolados antes de ser encolados nuevamente.

vhs vhs
7 jun 2017 09:24:29
Mostrar los 2 comentarios restantes
0
function insert_jquery_in_header(){
wp_enqueue_script('jquery', false, array(), false, false);
}
add_filter('wp_enqueue_scripts','insert_jquery_in_header',1);

Por defecto WordPress carga los archivos JS en el footer, así que de esta forma puedes forzar que se cargue en el header, ¡espero que te ayude!

21 ago 2017 19:48:12
2

Mi suposición es que tienes un plugin que está manipulando el registro de scripts para que jQuery se cargue en el footer. Estoy bastante seguro de que por defecto se carga en el <head>. Puedes intentar hacer que tu slideshow funcione si lo incluyes en el footer o puedes averiguar qué plugin está causando el problema e intentar corregirlo. Esto podría funcionar, pero no lo he probado.

function insert_jquery(){
   wp_enqueue_script('jquery');
}
add_filter('wp_enqueue_scripts','insert_jquery',1);

En términos generales, lo que estás haciendo no es la forma correcta de cargar scripts. Deberías estar registrando y encolando slideshow.js y casi con toda seguridad extrayendo el JavaScript de slideshow_output.php y registrando y encolando, pasando variables al script a través de wp_localize_script. Luego puedes hacer uso del parámetro $deps (ver los enlaces) para asegurarte de que todo se cargue en el orden necesario.

25 ago 2013 19:54:18
Comentarios

Entiendo que necesito investigar y aprender los problemas del "panorama general" que señalas, pero me desconcierta cómo el plugin 'rogue' aún puede hacer que jquery se cargue en el footer cuando todos los plugins han sido desactivados temporalmente.

John Doe John Doe
25 ago 2013 20:13:04

Si no es el plugin, entonces es el tema o, menos probable, un mu-plugin. La respuesta de @VinodDalvi apoya la idea de que jQuery se carga en el head por defecto.

s_ha_dum s_ha_dum
25 ago 2013 20:19:11
0

Mis problemas se resolvieron (usando WP 5.3.2 más un tema vacío sin archivos externos) cuando cargué un script propio con una dependencia añadida hacia jQuery (que viene incluido por defecto en WP).

function load_assets() {
    wp_enqueue_script( 'mm-scrollfix', site_url( '/wp-content/js/mm-scrollfix-1.0.js' , __FILE__ ), array( 'jquery' ), '1.0', true );
}
add_action( 'wp_enqueue_scripts', 'load_assets' );

Esa dependencia pareció, digamos, "despertar" jQuery. Nota que el último parámetro "true" en el código es para cargar el recurso antes de la etiqueta de cierre del body en lugar del head; que es donde wp_enqueue_scripts lo carga por defecto.

Si cargo el contenido del archivo .js en cuestión usando el hook wp_footer (que está incluso más abajo en el documento), sin declarar la dependencia, resulta en un

Uncaught ReferenceError: jQuery is not defined.

Así que, tal vez esto sea algo, no lo sé. Probablemente recibiré votos negativos - SO es demasiado elegante para mi cerebro rudimentario. %)

Saludos.

22 ene 2020 23:58:32