¿Usar el hook wp init para llamar a otros hooks?

9 oct 2012, 17:32:35
Vistas: 24.9K
Votos: 13

Quiero saber si es una buena práctica de acuerdo al desarrollo de temas o plugins de WordPress.

add_action('init','all_my_hooks');

function all_my_hooks(){

// algunas cosas de inicialización aquí y luego

add_action('admin_init',-----);
add_action('admin_menu',----);

// más como estos

}

gracias

0
Todas las respuestas a la pregunta 2
4
17

En general: Sí, espera a un hook específico para iniciar tu propio código. Nunca simplemente arrojes una instancia de objeto al espacio de nombres global. Pero el hook init rara vez es necesario.

Conecta tu código lo más tarde posible. Si tu primer código se ejecuta en wp_head, no uses un hook anterior. Incluso puedes encadenar hooks:

add_action( 'wp_head', 'primer_callback' );

function primer_callback()
{
    // hacer algo
    // luego
    add_action( 'wp_footer', 'segundo_callback' );
}

En cuanto al hook init: usa wp_loaded en su lugar. Este se ejecuta después de init y después de que se haya llamado a ms_site_check(). Así evitas que tu plugin se ejecute en un sub-sitio inválido en una instalación multisitio. Todo lo demás funciona igual.

9 oct 2012 17:47:59
Comentarios

+1 por la información sobre wp_loaded y MS.

kaiser kaiser
9 oct 2012 17:51:32

muchas gracias por tu respuesta, aún tengo una duda, ¿qué es mejor cargar todos los demás hooks dentro de wp_loaded o cargarlos por separado? Me pregunto si agrego hooks en wp_loaded, ¿se conectarán antes en lugar de hacerlo después de admin_init o admin_menu?

atinder atinder
9 oct 2012 21:35:35

¿los hooks en cascada no son un problema?

atinder atinder
9 oct 2012 22:50:19

No, ¿por qué debería ser así? Llama al segundo hook solo si el primero fue útil.

fuxia fuxia
9 oct 2012 22:56:57
0

No veo los beneficios grandes de esta práctica, por estas razones:

Tus funciones de callback no se llaman al registrarse

Las funciones add_action y add_filter solo agregan una entrada a la variable global $wp_filter que contiene todos los filtros y acciones. Ver fuente. No llama a tu función. Tu código se ejecutará solo cuando se llamen do_action y apply_filters (con el nombre de hook apropiado), lo que ocurre muy tarde en el lugar donde deberían estar esos hooks.

Podrías decir que hacer esto hará que la variable global $wp_filter se haga más grande => se requiere más memoria. Pero creo que crear una nueva función tiene el mismo problema.

Organización del código

Poner todo en una función te obliga a recordar todos los hooks en cada archivo de tu tema/plugin. No harías algo como esto:

  • en header.php: agregar hooks y funciones de callback para cosas que ocurren en el encabezado (como menú, registrar scripts)
  • en content.php: agregar hooks y funciones de callback para filtrar el contenido
  • en admin-menu.php: agregar hooks y funciones de callback para añadir menús de administración

(asumiendo que esos archivos están en tu tema/plugin)

En lugar de eso, tendrías que:

  • poner solo las funciones de callback en header.php, content.php, admin-menu.php
  • y poner todos los hooks en una función separada en otro archivo

=> Eso hará que sea difícil saber qué pasa cuando miras el contenido del archivo header.php. Tendrás que buscar para saber cuándo se activan estos callbacks.

Y piensa en la situación cuando tienes múltiples clases en tu tema/plugin. ¿Pones todos los hooks de todas las clases en un solo lugar? ¿O cada clase tiene una función envoltorio que contiene todos los hooks? ¡Es demasiado redundante!

Por encima de estas razones, creo que es cuestión de estilo personal :). Veo que algunos frameworks como Hybrid hacen lo que dices. ¡A veces me resulta difícil profundizar en esos frameworks!

10 oct 2012 05:01:07