Come determinare quale priorità usare con add_action()?
Stavo scrivendo un piccolo plugin per rimuovere alcuni elementi del menu per gli utenti non amministratori dal backend, e ho scoperto che il mio plugin non funzionava a meno che non specificassi una priorità nel mio codice:
add_action('admin_bar_menu', 'remove_toolbar_items', 999);
Senza il 999
, il codice non rimuove gli elementi nella mia funzione remove_toolbar_items
, mentre con esso funziona perfettamente:
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');
}
}
La documentazione per il parametro priorità afferma:
Utilizzato per specificare l'ordine in cui vengono eseguite le funzioni associate a una particolare azione. I numeri più bassi corrispondono a un'esecuzione anticipata, e le funzioni con la stessa priorità vengono eseguite nell'ordine in cui sono state aggiunte all'azione. Valore predefinito: 10
Tuttavia non ho trovato nulla che spieghi come si dovrebbe determinare quale priorità utilizzare. Come si determina quando usare la priorità e quale priorità utilizzare? Mi sento come se avessi potuto grattarmi la testa per ore se non avessi sperimentato con il parametro priorità.
Inoltre, vedo che la priorità predefinita è 10, ma esiste un intervallo noto di valori di priorità?

intervallo di valori di priorità? intervallo di valori di priorità?
In generale, non puoi sapere a priori con quale priorità qualcosa è stato agganciato. La priorità necessaria dipende da come sono stati agganciati altri callback. Spesso il valore predefinito è 10, ma potrebbe essere ovunque tra PHP_INT_MIN
(gli interi negativi sono comunque interi) e PHP_INT_MAX
e non c'è modo di esserne certi se non attraverso l'esperimento e, se possibile (come con il Core e qualsiasi tema o plugin di cui sei specificamente interessato), esaminando il codice sorgente.

Grazie. Sembra che il core dovrebbe avere qualche piccola utility integrata per fornirti queste informazioni.

WordPress organizza le tue azioni in un array con priorità indicizzate. Puoi visualizzarlo stampando (nel pannello di amministrazione admin_init
) $wp_filter
:
*Nota* come sottolinea @s_ha_dum nei commenti qui sotto, admin_init
potrebbe non catturare tutti gli hook aggiunti all'azione, una stampa più affidabile potrebbe essere agganciarsi a shutdown
invece.
function filter_print() {
global $wp_filter;
print_r( $wp_filter['admin_bar_menu'] );
die();
}
add_action( 'admin_init', 'filter_print' );
Questo ci restituisce un array ordinato che assomiglia a questo: (semplificato)
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] => ...
)
)
I valori 0, 4, 7, 10 e così via rappresentano le priorità delle azioni. Quando viene aggiunta una nuova azione, per impostazione predefinita ha priorità 10, simile all'indice 0 nell'esempio sopra, e vengono semplicemente accodate nello stesso indice dell'array. Considerando che molti hook vengono aggiunti a questa specifica azione, potresti voler inserire la tua azione alla fine o comunque dopo che un'azione specifica sia stata eseguita (come i menu). Una delle due priorità potrebbe funzionare altrettanto efficacemente: 81
o 201
.
Nella maggior parte dei casi, la priorità predefinita di 10 è sufficiente. Altre volte potresti voler aggiungere il tuo hook direttamente dopo un altro (magari per annullarne lo scopo o rimuovere un elemento specifico), in tal caso puoi utilizzare global $wp_filter;
per capire dove deve essere posizionato.

Ci ho pensato, ma mostrerà solo le cose agganciate prima o durante admin_init
e solo le cose agganciate nell'installazione corrente. Non dice nulla su ciò che un plugin o un tema non ancora installato potrebbe fare. Comunque +1.

@s_ha_dum È un buon punto, immagino che potresti anche usare qualcosa come admin_footer
, giusto? O sarebbe lo stesso problema?

L'hook shutdown
sarebbe la scelta migliore, ma solo per il codice installato e anche in quel caso, le cose possono essere agganciate condizionalmente, quindi potrebbe essere possibile perderne alcune comunque.

Bene, c'è un modo per trovare la priorità di un'azione.
Possiamo usare il seguente codice has_action( $tag, $function_to_check )
che opzionalmente restituisce la priorità su quell'hook per la funzione specificata.
Rif: https://codex.wordpress.org/Function_Reference/has_action

Nel caso qualcuno stia cercando la lista delle priorità/riferimenti delle azioni di WordPress, il collegamento completo agli hook è qui:
