Cómo cargar jQuery de WordPress en la sección <head>
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.

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.

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?

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.

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?

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

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.

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

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!

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.

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.

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.
