En el tema functions.php de mi tema, estoy llamando a add_action para obtener una medida de control sobre dónde se carga jquery (en el pie de página junto con los otros scripts de mi tema).
El problema que tengo es que cuando uso add_action ('wp_enqueue_scripts'), solo parece activarse si no se cargan complementos. Sin embargo, el método add_action ('init') funciona en todos los casos.
No recuerdo por qué, pero creo que en este caso se prefiere add_action ('wp_enqueue_scripts'). Si eso es cierto, ¿cómo puedo hacer que funcione en todos los casos?
En functions.php
//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT
if(!is_admin())
{
require_once(TEMPLATEPATH . '/functions_public.php');
}
En functions_public.php
function my_theme_init()
{
/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');
/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);
wp_enqueue_script('jquery');
}
El segundo método, que usa add_action ('wp_enqueue_scripts') aparentemente no se ejecuta en condiciones en las que hay un complemento que escribe las dependencias de script en el tema.
fuente
Respuestas:
Muchos desarrolladores de complementos no hacen las cosas de la manera correcta. La forma correcta es engancharse
wp_enqueue_scripts
como lo que estás tratando de hacer.Sin embargo, aquí está el orden de ejecución de los ganchos en una solicitud típica:
La cuestión es que a varios desarrolladores se les dijo originalmente que se conectaran
init
para poner en cola sus scripts. Antes de tener unwp_enqueue_script
gancho, esa era la forma "correcta" de hacer las cosas, y los tutoriales que perpetúan la práctica todavía están flotando en Internet, corrompiendo a los buenos desarrolladores.Mi recomendación sería dividir su función en dos partes. Haga su
wp_deregister_script
/wp_register_script
en elinit
gancho y use elwp_enqueue_scripts
gancho cuando realmente ponga en cola jQuery.Esto lo mantendrá en el mundo de "hacerlo bien" para poner en cola sus scripts, y lo ayudará a protegerse de los cientos de desarrolladores que todavía "lo hacen mal" al cambiar jQuery por su versión concatenada antes de agregarlo a la cola .
También querrás agregar tu
init
gancho con alta prioridad:fuente
priority
adición de acciones. Todo depende de cómo veas la prioridad. Si desea que el suyo se ejecute "primero", entonces un número menor es mejor, una prioridad más alta en el orden de la cola de ejecución. Pero si desea que el efecto de su función tenga prioridad sobre los demás, querrá que se ejecute más tarde, por lo que una mayor prioridad por "efecto". Y en este caso, probablemente sea un número más alto que desearía. Aunque hay poco mérito en cambiar la versión RTM de jquery, como sugiere el comentarista anterior.Aquí hay varios problemas que están relacionados entre sí.
wp_enqueue_scripts
wp_enqueue_script()
, establezca el$footer
parámetro entrue
add_action( $hook, $callback )
llamadas no deben estar envueltas en nada; déjalos ejecutar directamente desdefunctions.php
is_admin()
cheques condicionales dentro de su devolución de llamadawp_enqueue_scripts
es demasiado tarde . Divida su código de baja / registro en una devolución de llamada enganchadainit
.get_template_directory()
lugar deTEMPLATEPATH
Poniendolo todo junto:
Pero de nuevo: este no es realmente el mejor enfoque. Su mejor opción es simplemente eliminar las devoluciones de llamada de plugin add_action () que anulan el registro de core jQuery, o usar Plugins que no hacen algo tan imprudente como reemplazar jQuery incluido en el núcleo.
fuente
_doing_it_wrong()
llamar a algo que no es solo jQuery "jQuery". Además: jQuery en sí mismo simplemente puede retirarse para asegurarse de que no se cargue dos veces. Lawp_dequeue_script()
llamada solo debe realizarse con una prioridad suficiente para garantizar que nada la atrape después.