Utilizarea hook-ului wp init pentru a apela alte hook-uri
Vreau să știu dacă este o practică bună conform dezvoltării de teme sau plugin-uri WordPress.
add_action('init','all_my_hooks');
function all_my_hooks(){
// unele lucruri de inițializare aici și apoi
add_action('admin_init',-----);
add_action('admin_menu',----);
// mai multe de acest gen
}
mulțumesc
În general: Da, așteptați un hook dedicat pentru a începe codul propriu. Niciodată nu aruncați o instanță de obiect direct în namespace-ul global. Dar init este rareori necesar.
Conectați-vă cât mai târziu posibil. Dacă primul cod rulează pe wp_head, nu folosiți un hook mai devreme. Puteți chiar să cascadați hook-uri:
add_action( 'wp_head', 'first_callback' );
function first_callback()
{
// faceți ceva
// apoi
add_action( 'wp_footer', 'second_callback' );
}
Referitor la hook-ul init: Folosiți wp_loaded în loc. Acesta rulează după init și după ce ms_site_check() a fost apelat. Astfel evitați să rulați pluginul pe un sub-site invalid într-o instalare multi-site. Orice altceva rămâne la fel.
multumesc mult pentru raspuns, totusi ramane o nelamurire, care este mai bine sa incarci toate celelalte hook-uri in interiorul wp_loaded sau sa le incarci separat ? ma intreb daca adaug hook-uri in wp_loaded ele vor fi conectate mai devreme in loc sa fie conectate dupa admin_init sau admin_menu ?
atinder
Nu văd beneficiile mari ale acestei practici, din următoarele motive:
Funcțiile tale de callback nu sunt apelate la înregistrare
Funcțiile add_action și add_filter doar adaugă o intrare în variabila globală $wp_filter care conține toate filtrele și acțiunile. Vezi sursa. Nu apelează funcția ta. Codul tău va rula doar când sunt apelate do_action și apply_filters (cu numele corespunzător al hook-ului), ceea ce se întâmplă foarte târziu în locul unde acele hook-uri ar trebui să fie.
Ai putea spune că asta va face ca variabila globală $wp_filter să devină mai mare => mai multă memorie necesară. Dar cred că crearea unei noi funcții are aceeași problemă.
Organizarea codului
Punând totul într-o singură funcție te obligă să ții minte toate hook-urile în fiecare fișier din tema/pluginul tău. Nu ai face ceva de genul:
- în
header.php: adaugi hook-uri și funcții de callback pentru lucruri care se întâmplă în header (cum ar fi meniul, înregistrarea scripturilor) - în
content.php: adaugi hook-uri și funcții de callback pentru filtrarea conținutului admin-menu.php: adaugi hook-uri și funcții de callback pentru a adăuga meniuri în admin
(presupunând că acele fișiere sunt puse în tema/pluginul tău)
În loc de asta, trebuie să:
- pui doar funcții de callback în
header.php,content.php,admin-menu.php - și să pui toate hook-urile într-o funcție separată într-un alt fișier
=> Asta te va face să nu înțelegi ce se întâmplă când te uiți la conținutul fișierului header.php. Trebuie să cauți să afli când sunt declanșate acele callback-uri.
Și gândește-te la situația când ai mai multe clase în tema/pluginul tău. Pui toate hook-urile din toate clasele într-un singur loc? Sau fiecare clasă are o funcție wrapper care conține toate hook-urile? E prea redundant!
În afara acestor motive, cred că e o chestiune de stil personal :). Văd unele framework-uri cum ar fi Hybrid care fac ce ai spus. Uneori îmi face greu să înțeleg acele framework-uri!