Utilizarea hook-ului wp init pentru a apela alte hook-uri

9 oct. 2012, 17:32:35
Vizualizări: 24.9K
Voturi: 13

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

0
Toate răspunsurile la întrebare 2
4
17

Î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.

9 oct. 2012 17:47:59
Comentarii

+1 pentru wp_loaded și informațiile despre MS.

kaiser kaiser
9 oct. 2012 17:51:32

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 atinder
9 oct. 2012 21:35:35

cascadarea hook-urilor nu este o problema ?

atinder atinder
9 oct. 2012 22:50:19

Nu, de ce ar trebui să fie? Apelează al doilea hook doar dacă primul a fost util.

fuxia fuxia
9 oct. 2012 22:56:57
0

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!

10 oct. 2012 05:01:07