Cum să știi ce prioritate să folosești cu add_action()?
Scriam un plugin mic pentru a elimina anumite elemente de meniu pentru utilizatorii non-admin din backend și am descoperit că plugin-ul meu nu făcea nimic dacă nu specificam o prioritate în cod:
add_action('admin_bar_menu', 'remove_toolbar_items', 999);
Fără 999
, codul nu elimină elementele din funcția mea remove_toolbar_items
, dar cu această valoare funcționează perfect:
function remove_toolbar_items( $wp_admin_bar ) {
if ( !current_user_can( 'manage_options' ) ) {
$wp_admin_bar->remove_node('new-post');
$wp_admin_bar->remove_node('comments');
}
}
Documentația pentru parametrul de prioritate menționează:
Este folosit pentru a specifica ordinea în care sunt executate funcțiile asociate cu o anumită acțiune. Numerele mai mici corespund cu o execuție mai timpurie, iar funcțiile cu aceeași prioritate sunt executate în ordinea în care au fost adăugate la acțiune. Valoare implicită: 10
Cu toate acestea, nu am găsit nimic care să explice cum ar trebui să determini ce prioritate să folosești. Cum determini când să folosești prioritatea și ce prioritate să folosești? Simt că aș fi putut să-mi bat capul ore întregi dacă nu m-aș fi jucat cu parametrul de prioritate.
De asemenea, văd că prioritatea implicită este 10, dar există un interval cunoscut de valori pentru prioritate?

intervalul de valori de prioritate? intervalul de valori de prioritate?
În general, nu poți ști a priori cu ce prioritate este conectat un anumit eveniment. Prioritatea necesară depinde de modul în care au fost conectate alte funcții callback. Adesea, valoarea implicită este 10, dar poate fi oriunde între PHP_INT_MIN
(numerele negative sunt tot numere întregi) și PHP_INT_MAX
, și nu există altă modalitate de a fi sigur decât prin experimentare și, dacă este posibil (cum ar fi în cazul nucleului WordPress și al oricăror teme sau plugin-uri care te preocupă în mod special), prin examinarea codului sursă.

Mulțumesc. Se pare că nucleul ar trebui să aibă o mică utilitate încorporată pentru a oferi această informație.

WordPress stochează acțiunile tale într-un array indexat după priorități. Poți vedea acest lucru afișând (în panoul de administrare admin_init
) variabila $wp_filter
:
*Notă* după cum menționează @s_ha_dum în comentariile de mai jos, admin_init
poate să nu prindă toate hook-urile adăugate la acțiune, o metodă mai sigură de afișare ar fi folosirea hook-ului shutdown
.
function filter_print() {
global $wp_filter;
print_r( $wp_filter['admin_bar_menu'] );
die();
}
add_action( 'admin_init', 'filter_print' );
Aceasta ne va oferi un array ordonat care arată cam așa: (simplificat)
Array(
[admin_bar_menu] => Array (
[0] => Array (
[wp_admin_bar_my_account_menu] => Array (
[function] => wp_admin_bar_my_account_menu
[accepted_args] => 1
)
[wp_admin_bar_sidebar_toggle] => Array (
[function] => wp_admin_bar_sidebar_toggle
[accepted_args] => 1
)
)
[4] => Array (
[wp_admin_bar_search_menu] => Array (
[function] => wp_admin_bar_search_menu
[accepted_args] => 1
)
)
[7] => Array (
[wp_admin_bar_my_account_item] => Array (
[function] => wp_admin_bar_my_account_item
[accepted_args] => 1
)
)
[10] => Array (
[wp_admin_bar_wp_menu] => Array (
[function] => wp_admin_bar_wp_menu
[accepted_args] => 1
)
)
[20] => ...
)
)
Numerele 0, 4, 7, 10 și așa mai departe reprezintă prioritățile acțiunilor. Când o nouă acțiune este adăugată, prioritatea implicită este 10, similar cu indexul 0 din exemplul de mai sus, acestea sunt doar grupate în același index al array-ului. Având în vedere că multe hook-uri sunt adăugate la această acțiune specifică, ai putea dori să rulezi codul la final sau după ce o anumită acțiune a fost executată (cum ar fi meniurile). Una dintre cele două priorități ar putea funcționa la fel de eficient: 81
sau 201
.
În majoritatea cazurilor, prioritatea implicită de 10 este suficientă. Alteori, poți dori să adaugi hook-ul direct după altul (pentru a-i anula scopul sau pentru a elimina un element specific), caz în care poți folosi global $wp_filter;
pentru a determina unde trebuie plasat.

M-am gândit la asta, dar va afișa doar elementele conectate înainte sau la admin_init
și doar elementele conectate în instalarea curentă. Nu spune nimic despre ceea ce ar putea face un plugin sau o temă care încă nu a fost instalată. Oricum, +1.

@s_ha_dum E un punct bun, cred că ai putea folosi și ceva de genul admin_footer
, nu? Sau ar fi aceeași problemă?

Hook-ul shutdown
ar fi cea mai bună opțiune, dar doar pentru codul deja instalat, iar chiar și așa, unele elemente pot fi conectate condiționat, așa că e posibil să ratezi unele oricum.

Ei bine, există o modalitate de a afla prioritatea unei acțiuni.
putem folosi următorul cod has_action( $tag, $function_to_check )
care returnează opțional prioritatea pe acel hook pentru funcția specificată.
Referință: https://codex.wordpress.org/Function_Reference/has_action

În cazul în care cineva caută lista de acțiuni WordPress cu priorități/referințe, link-ul complet pentru hook-uri poate fi găsit aici:
