Esiste un limite per agganciare la priorità?


9

Quando desidero che il mio filtro o hook di azione prevalga su tutti gli altri, gli assegnerò una priorità di 999. Tuttavia, ultimamente ho visto alcune persone usare valori estremi per la priorità, come 20000e persino99999

Oltre al fatto che l'utilizzo di priorità così alte è ridicolo, funzioneranno davvero? Esiste un limite per agganciare la priorità? Cosa succederà se il limite viene superato? C'è una differenza di prestazioni quando si utilizzano priorità estreme?

Aggiornamento: @harke suggerisce su Stack Overflow che il numero è limitato daPHP_INT_MAX


Non hai collegato a una risposta di @hakre che ne parlava? Dovrebbe essere parte del Q, e altro ancora, seguire l'esempio che ha dato, sospetto che sappia seriamente una o due cose ...
brasofilo,

A quale risposta ti riferisci?
shea,

Risposte:


13

Non ci sono limiti né penalità per le prestazioni. Per capire perché, è necessario capire come sono memorizzati tutti gli hook nell'ecosistema WP.

Prima di tutto devi capire dove sono memorizzati tutti gli hook e come lo fanno. Tutti gli hook per filtri e azioni sono memorizzati in una variabile globale chiamata wp_filter, sì sì anche gli hook di azione sono memorizzati in questa variabile. Questa variabile è un array associato, dove key è il nome dell'azione o del filtro e value è un altro array associativo. Ad esempio diamo un'occhiata all'azione 'init', in questa fase vedremo la seguente struttura:

$wp_filter = array(
    'init' => array(...),
);

Questo array secondario ha chiavi e valori numerici come array. I tasti numerici sono le nostre priorità. Le matrici, associate ai tasti numerici, contengono un elenco di hook con la stessa priorità. Quindi, se chiamiamo add_action( 'init', 'wpse8170_my_first_init', 20 ), quindi chiamiamo add_action( 'init', 'wpse8170_my_second_init', 20 )e infine chiamiamo add_action( 'init', 'wpse8170_my_third_init', 10 ), il nostro esempio sarà simile a:

$wp_filter = array(
    'init' => array(
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
    ),
);

Ora, quando initviene attivata l'azione, tutti gli hook verranno ordinati in base all'uso della ksortfunzione e il nostro array apparirà ora:

    array(
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
    ),

E tutti gli hook verranno eseguiti in questa coda: prima 'wpse8170_my_third_init', poi 'wpse8170_my_first_init'e infine 'wpse8170_my_second_init'.

Quindi puoi vedere che non ci sono limiti e penalità e puoi usare qualsiasi valore accettabile come chiave per l'array associato dal tuo ambiente PHP.


2
max( $priorities ) + 1fallirà se l'ultimo numero è uguale a PHP_INT_MAX. In tal caso devi convertire il valore in una stringa e aggiungere qualcosa ad esso.
fuxia

@toscho Sì, d'accordo. Aggiornato lo snippet di bonus.
Eugene Manuilov,

2
Il "bonus" è una cattiva idea, nel caso in cui la definizione per $wp_filtersempre cambi. Non è pensato per essere utilizzato direttamente dai plugin. Abbiamo apportato modifiche in passato (principalmente per motivi di prestazioni, per inciso).
Andrew Nacin,

@AndrewNacin ok, l'ho rimosso perché causa troppe domande :)
Eugene Manuilov

6

È un numero intero, quindi su un sistema PHP a 32 bit sarà limitato da -2147483648 a 2147483647 e su PHP a 64 bit sarà limitato a -9223372036854775808 a 9223372036854775807.

Modifica: nessuna penalità per le prestazioni, è un numero intero.

Ma sul serio? :)


Capisco che è un numero intero, ma stavo parlando dell'attuale meccanismo di hook. Ho sentito la gente dire che avere un hook troppo grande farà fallire completamente l'hook, e il callback non verrà eseguito
shea

Oms? Quando? È solo un indice in un array e un array sparso in questo, quindi l'impatto è trascurabile. Ma onestamente, i grandi numeri sono praticamente un indicatore di non capire un problema (ad es.
Provare

1

@shea - Le azioni di WordPress funzionano esattamente nel modo OPPOSTO che hai assunto. Una cifra con priorità più alta NON sovrascriverà gli altri e l'uso di PHP_INT_MAX NON è un tentativo "estremo" di forzare l'esecuzione di questa azione / filtro prima di altre.

Per mettere la tua azione / filtro in cima all'ordine di esecuzione, dovrai usare una priorità di 0.

PHP_INT_MAX è semplicemente all'estremità opposta; viene utilizzato quando si desidera che l'azione / il filtro vengano eseguiti DOPO che tutti gli altri hook (a priorità normale) sono stati completati.


1
Sì, questa è esattamente l'idea. Il filtro finale che viene eseguito su un hook sarà in grado di modificare la variabile senza preoccuparsi di ulteriori cambiamenti
shea

È anche possibile utilizzare valori interi negativi $priority, quindi i callback collegati con priorità 0non saranno necessariamente in cima all'ordine di esecuzione.
Dave Romsey,

0

Nessun limite e nessuna penalità per le prestazioni. Dall'ispezione del codice puoi persino usare le stringhe come priorità anche se non consiglierei di farlo;)

Se la tua azione deve essere l'ultima, puoi ispezionare le priorità assegnate guardando gli indici del globale $wp_actions[your hook]quando viene chiamata la tua azione e aggiungerla di nuovo con maggiore priorità se necessario, ma non riesco a vedere un motivo per fare effettivamente questo tipo di cose.


0

Non c'è "praticamente" alcun limite in quanto gli hook sono effettivamente memorizzati come array e la priorità è l'indice numerico.

Ma, in realtà, la dimensione dell'array sarà limitata dalla quantità di memoria allocata per l'esecuzione dello script.

Quindi, immagino che l'impostazione di un numero di priorità ridicolmente grande - che si traduca semplicemente in un indice numerico nell'array in cui sono memorizzate le funzioni agganciate - non dovrebbe arrestare il blocco di wordpress.

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.