Come sapere quale priorità utilizzare con add_action ()?


12

Stavo scrivendo un piccolo plug-in per rimuovere dal back-end alcune voci di menu per utenti non amministratori e ho scoperto che il mio plug-in non faceva nulla 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 remove_toolbar_itemsfunzione e con esso funziona alla grande:

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');
    }
}

I documenti per lo stato del parametro prioritario:

Utilizzato per specificare l'ordine in cui vengono eseguite le funzioni associate a una determinata azione. I numeri più bassi corrispondono a un'esecuzione precedente 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 dovresti determinare quale priorità utilizzare. Come si determina quando utilizzare la priorità e quale priorità utilizzare? Sento che avrei potuto grattarmi la testa per ore se non avessi giocato con il parametro di priorità.

Inoltre, vedo che la priorità predefinita è 10, ma esiste un intervallo noto di valori di priorità?

Risposte:


6

intervallo di valori prioritari? intervallo di valori prioritari?

In generale, parlando, non si può sapere a priori con quale priorità è agganciato qualcosa. La priorità necessaria dipende dal modo in cui sono stati agganciati altri callback. Spesso questo è il valore predefinito di 10 ma potrebbe essere ovunque tra PHP_INT_MIN(gli interi negativi sono ancora numeri interi) PHP_INT_MAXe non c'è modo di essere sicuri se non tramite esperimento e, se possibile ( come per il Core e tutti i temi o plugin di cui ti occupi in particolare), esaminando la fonte.


1
Grazie. Sembra che il core dovrebbe avere qualche piccola utility integrata per darti queste informazioni.
j08691,

Non sono informazioni corrette e non è possibile rispondere. Mohammed Asif ha risposto correttamente. has_filter ('init', 'some_hook') consente di sapere quale azione prioritaria ha.
Юра Косяк,

5

WordPress inserisce le tue azioni in un array con priorità indicizzate. Puoi vederlo stampando (nel pannello di amministrazione admin_init) $wp_filter:

* Nota * come sottolineato da @s_ha_dum nei commenti sottostanti, admin_initpotrebbe non catturare tutti i ganci aggiunti nell'azione, invece si potrebbe agganciare la stampa più affidabile shutdown.

function filter_print() {
    global $wp_filter;
    print_r( $wp_filter['admin_bar_menu'] );
    die();
}
add_action( 'admin_init', 'filter_print' );

Questo ci dà un array pulito 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] => ...
    )
)

0, 4, 7, 10 e così via sono le priorità delle azioni, quando viene aggiunta una nuova azione è impostata automaticamente su 10, simile all'indice 0 nell'esempio sopra, vengono semplicemente impilati nello stesso indice dell'array . Considerando che molti hook sono stati aggiunti a questa particolare azione che si vorrebbe fare alla fine o alla fine dopo che è stata eseguita un'azione specifica (come i menu). 1 delle due priorità potrebbe funzionare altrettanto efficacemente: 81o 201.

Per la maggior parte, la priorità predefinita di 10 è sufficiente. Altre volte vuoi aggiungere il tuo hook direttamente dopo l'altro (per annullarne lo scopo o rimuoverne uno specifico) nel qual caso puoi usare il global $wp_filter;per capire dove deve andare.


Ci ho pensato, ma mostrerà solo cose agganciate prima o dopo admin_init e solo cose agganciate sull'installazione corrente. Non dice nulla su cosa potrebbe fare un plugin o un tema ancora disinstallato. +1 comunque.
s_ha_dum,

@s_ha_dum Questo è un buon punto, immagino che potresti anche usare qualcosa come admin_footerse fosse giusto? O sarebbe lo stesso problema?
Howdy_McGee

1
L' shutdownhook sarebbe la soluzione migliore, ma solo per il codice installato e anche in questo caso, le cose possono essere agganciate in modo condizionale, quindi potrebbe essere possibile perdersi comunque.
s_ha_dum,


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.