Come determinare quale priorità usare con add_action()?

23 giu 2015, 19:45:03
Visualizzazioni: 39.9K
Voti: 18

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à?

0
Tutte le risposte alla domanda 4
2

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.

23 giu 2015 20:01:25
Commenti

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

j08691 j08691
24 giu 2015 22:34:06

Questa non è un'informazione corretta e non può essere una risposta. Mohammed Asif ha risposto correttamente. has_filter('init', 'some_hook') permette di conoscere quale priorità ha l'azione.

Yurii Kosiak Yurii Kosiak
27 apr 2020 10:05:05
3

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.

23 giu 2015 20:13:06
Commenti

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 s_ha_dum
23 giu 2015 20:29:44

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

Howdy_McGee Howdy_McGee
23 giu 2015 20:31:13

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.

s_ha_dum s_ha_dum
23 giu 2015 20:34:33
0

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

26 dic 2017 08:58:50
0

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

https://codex.wordpress.org/Plugin_API/Action_Reference/

4 ott 2019 16:44:58