Cuándo usar add_action ('init') vs add_action ('wp_enqueue_scripts')

9

En las funciones de mi tema.php, 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'), parece que solo se dispara si no se cargan complementos. Sin embargo, el método add_action ('init') funciona en todos los casos.

No puedo recordar 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 utiliza add_action ('wp_enqueue_scripts') aparentemente no se ejecuta en condiciones en las que hay un complemento que escribe las dependencias del script para el tema.

    
pregunta N2Mystic 20.06.2012 - 16:55

2 respuestas

25

Muchos desarrolladores de complementos no hacen las cosas de la manera correcta. La forma a la derecha es conectar a wp_enqueue_scripts como lo estás intentando hacer.

Sin embargo, aquí está el orden de los ganchos que se ejecutan en una solicitud típica:

  • muplugins_loaded
  • registered_taxonomy
  • registered_post_type
  • plugins_loaded
  • sanitize_comment_cookies
  • setup_theme
  • load_textdomain
  • after_setup_theme
  • auth_cookie_malformed
  • auth_cookie_valid
  • set_current_user
  • init
  • widgets_init
  • register_sidebar
  • wp_register_sidebar_widget
  • wp_default_scripts
  • wp_default_stypes
  • admin_bar_init
  • add_admin_bar_menus
  • wp_loaded
  • parse_request
  • send_headers
  • parse_query
  • pre_get_posts
  • posts_selection
  • wp
  • template_redirect
  • get_header
  • wp_head
  • wp_enqueue_scripts
  • wp_print_styles
  • wp_print_scripts
  • ... mucho más

El problema es que a varios desarrolladores se les pidió originalmente que engancharan a init para poner en cola sus scripts. Antes de que tuviéramos un wp_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 el gancho init y use el enganche wp_enqueue_scripts cuando en realidad ponga JQuery en cola.

Esto te mantendrá en el mundo de "hacerlo bien" para poner en cola tus scripts, y te ayudará a protegerte de los cientos de desarrolladores que aún lo hacen "mal" cambiando jQuery por tu versión concatenada antes de que lo agreguen a la cola.

También querrá agregar su gancho init con una prioridad alta:

add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
    // ...
}
    
respondido por el EAMann 20.06.2012 - 17:38
3

Aquí hay varios problemas que están relacionados entre sí.

  1. El gancho de acción correcto que se utiliza para poner en cola los scripts es wp_enqueue_scripts
  2. Para imprimir scripts en el pie de página a través de wp_enqueue_script() , establezca el parámetro $footer en true
  3. Sus llamadas add_action( $hook, $callback ) no deben estar envueltas en nada; Deje que se ejecuten directamente desde functions.php
  4. Debes poner tus cheques condicionales de is_admin() dentro de tu devolución de llamada
  5. No debe anular el registro de secuencias de comandos agrupadas en el núcleo de un tema, por ningún motivo. Incluso si su propósito es la concatenación de scripts, eso es territorio del complemento .
  6. Si debe anular el registro de jQuery, wp_enqueue_scripts es demasiado tarde . Dividir el código de registro / registro en una devolución de llamada enganchada en init .
  7. Llamar a algún otro script "jquery" probablemente tampoco sea una buena práctica. Tu mejor apuesta sería simplemente sacar a la cola jQuery , y luego cargar tu script personalizado.
  8. Asegúrate de poner una prioridad baja en tu devolución de llamada, para que anules los complementos
  9. Use get_template_directory() en lugar de TEMPLATEPATH

Poniéndolo todo junto:

<?php
function wpse55924_enqueue_scripts() {
    if ( ! is_admin() ) {

        // Dequeue jQuery
        wp_dequeue_script( 'jquery' );

        // Register/enqueue a custom script, that includes jQuery
        wp_register_script( 'mythemescripts', get_template_directory_uri() . '/scripts.mythemescripts.js', false, false,true );
        wp_enqueue_script( 'mythemescripts' ); 
    }
}
add_action( 'wp_enqueue_scripts', 'wpse55924_enqueue_scripts', 99 );

Pero de nuevo: este no es realmente el mejor enfoque. Su mejor opción es simplemente eliminar las devoluciones de llamada de complemento add_action () que eliminan el registro de jQuery central, o usar complementos que no hacen algo tan imprudente como reemplazar jQuery con núcleo incluido.

    
respondido por el Chip Bennett 20.06.2012 - 17:50

Lea otras preguntas en las etiquetas