Domanda Funzioni anonime negli hook di WordPress


Gli hook di WordPress possono essere utilizzati in due modi:

  1. utilizzando il nome della funzione di callback e la funzione appropriata

    add_action( 'action_name', 'callback_function_name' );
    function callback_function_name() {
        // do something
    }
    
  2. usando la funzione anonima (chiusura)

    add_action( 'action_name', function() {
        // do something
    } );
    

C'è qualche differenza per WordPress che modo usare? Qual è il modo preferito e perché?


22
2017-07-06 07:52


origine


risposte:


Lo svantaggio della funzione anonima è che non sei in grado di rimuovere l'azione con remove_action.

Importante: per rimuovere un gancio, il $function_to_remove e $priority gli argomenti devono corrispondere quando è stato aggiunto l'hook. Questo vale sia per i filtri che per le azioni. Nessun avviso verrà dato in caso di mancata rimozione.

Perché non hai definito function_to_remove, non puoi rimuoverlo.

Quindi non dovresti mai usare questo all'interno di plugin o temi che qualcun altro potrebbe voler sovrascrivere.


26
2017-07-06 11:35



L'utilizzo di chiusure ha il vantaggio di mantenendo pulito lo spazio dei nomi globale, perché non è necessario creare prima una funzione globale come callback.

add_action('admin_init', function () {
    // some code...
});

Personalmente preferirei usare le chiusure come callback, salvo che:

  • Vuoi la possibilità di rimuovere la richiamata
  • La funzione di callback deve essere utilizzata più di una volta
  • Hai bisogno di supporto per le versioni PHP precedenti (meno di 5.3)

Chiusure in classi

Le chiusure possono anche essere benefico all'interno delle classi.

class SomeClass
{
    public function __construct()
    {
        add_action('wp_head', function () {
            $this->addSomeStyling();
        });
    }

    protected function addSomeStyling()
    {
        echo '<style> body { color: #999; } </style>';
    }
}

Normalmente i metodi di callback devono essere fatti pubblico, ma in questo caso puoi anche farli privato o protetta.

Questa soluzione funziona solo con PHP 5.4+. Per farlo funzionare anche con PHP 5.3, è necessario passare esplicitamente $this oggetto riferimento alla chiusura, come:

    public function __construct()
    {
        $self = $this;

        add_action('wp_head', function () use ($self) {
            $self->addSomeStyling();
        });
    }

11
2018-04-01 15:41