Spiegazione della funzione apply_filters e delle sue variabili

6 mag 2011, 18:56:15
Visualizzazioni: 20.5K
Voti: 17

Sto imparando a costruire form HTML utilizzando PHP prendendo esempio dal plugin "simplr form registration".

Sto esaminando questo codice:

$form .= apply_filters('simplr-reg-instructions', __('Please fill out this form to sign up for this site', 'simplr-reg'));

Potresti spiegare cosa sta succedendo qui - cosa fa la funzione, perché c'è bisogno di 'simplr-reg-instructions' e 'simplr-reg'?

Perché questa riga non può essere semplicemente:

$form .= 'Please fill out this form to sign up for this site' ;

Ho letto il riferimento della funzione ma ancora non riesco a capirlo.

0
Tutte le risposte alla domanda 2
4
23

Quella riga utilizza due diverse funzioni che richiedono due spiegazioni separate.

__()

Questa è una funzione di traduzione. Se le impostazioni sono configurate correttamente, tradurrà il primo parametro da una lista di stringhe pre-tradotte. Se un'installazione ha un file con una traduzione compilata per questa funzione da utilizzare, la userà. Naturalmente, il plugin deve includere la propria traduzione, da qui il secondo parametro. simplr-reg indica a __() che la traduzione della stringa 'Please fill out this form to sign up for this site' dovrebbe essere nel file di traduzione associato a 'simplr-reg' (questo viene fatto precedentemente nel plugin tramite la funzione load_plugin_textdomain()).

La funzione restituisce quindi la traduzione. Se non c'è una traduzione da restituire (ad esempio la lingua corrente non ha una traduzione compilata, la stringa non ha una traduzione compilata per quel pacchetto, ecc.), viene restituito l'input originale.

Quindi, per un sito WordPress in inglese, __( 'This', 'simplr-reg' ) è funzionalmente equivalente a 'This'. Per saperne di più sulla l10n (Localizzazione), leggi la documentazione nel codex:

http://codex.wordpress.org/I18n_for_WordPress_Developers

apply_filters()

Questa funzione ti permette di filtrare i valori utilizzati dal plugin secondo necessità. Questo è uno dei concetti principali da comprendere come sviluppatore di plugin. WordPress è estendibile tramite hook, che sono fondamentalmente punti di accesso che ti permettono di sincronizzare l'esecuzione delle azioni del tuo plugin e/o manipolare le informazioni/dati che WordPress utilizza, ecc.

Per manipolare dati come lo snippet di codice di cui hai chiesto, useresti la funzione add_filter(). Ecco un esempio basilare di come funziona:

add_filter( 'simplr-reg-instructions', 'wpse16573_my_filter' );

Probabilmente riconoscerai il primo argomento. È lo stesso usato in add_filter sopra. Questo è il nome dell'hook. Il secondo argomento è il callback del filtro. Deve essere un callback valido a una funzione (leggi di più sui callback qui). Quella riga di codice dice "Quando l'hook 'simplr-reg-instructions' viene eseguito, esegui la funzione con il callback che ho fornito." apply_filters() esegue l'hook trovato nel suo primo argomento, essenzialmente significa "esegui tutte le funzioni registrate per questo hook." apply_filters poi passa tutti gli altri argomenti (in questo caso, 'Please fill out this form to sign up for this site') alle funzioni su quel filtro. Quindi, il callback che ho usato sopra dovrebbe essere così:

function wpse16573_my_filter( $text ){
  $text = "<strong>$text</strong>";
  return $text;
}

Ci sono due tipi di hook in WordPress: filtri (il tipo che stiamo usando qui) e azioni. La differenza principale tra i due è che i filtri si aspettano che tu restituisca qualcosa mentre le azioni no. Quindi, per questo filtro, il mio esempio sopra aggiunge del html attorno a 'Please fill out this form to sign up for this site' e lo restituisce.

Leggi di più su azioni e hook qui:

http://codex.wordpress.org/Plugin_API

6 mag 2011 19:27:29
Commenti

John, grazie mille. Ottima risposta! Ma non riesco a trovare nemmeno una riga "add_filter( 'simplr-reg-instructions',..." nei file del plugin. Come può quindi essere eseguito l'apply_filter?

Ash Ash
8 mag 2011 10:31:54

Se non ci sono filtri aggiunti a un hook, restituisce semplicemente l'input originale così com'è. Il filtro non è lì per essere usato dal plugin, è lì per te, nel caso tu ne abbia bisogno o voglia, così che tu non debba modificare il plugin stesso.

John P Bloch John P Bloch
9 mag 2011 16:13:37

+1 Spiegazione Eccellente - Sembra Scritta Come Dovrebbero Essere le Documentazioni ;-)

Edward J Beckett Edward J Beckett
10 gen 2013 06:00:34

+1 Ottima risposta, esattamente quello che stavo cercando, ero estremamente confuso ma ora tutto è così chiaro ;)

doz87 doz87
30 nov 2015 16:21:23
4

Qui hai due diverse funzioni: apply_filters e __().

La funzione apply_filters è il modo in cui WordPress ti permette di modificare il valore delle variabili utilizzando le tue funzioni di callback e la funzione add_filter. Accetta molti argomenti, ma i più importanti sono i primi due:

$something = apply_filters( $tag, $value, $var ... );

$tag è il nome del filtro (hook) che viene utilizzato in add_filter, ad esempio:

add_filter($tag, callback_function);

$value è il valore effettivo che potrai modificare.

$var sono le variabili che la tua funzione di callback può utilizzare, una o più.

La funzione __() viene utilizzata per le traduzioni:

__($message, $text_domain);

$message è il messaggio effettivo da tradurre.

$text_domain è il dominio di testo utilizzato per caricare la traduzione del plugin o del tema con load_plugin_textdomain().

Cosa fa?

Cerca nel modulo di localizzazione la traduzione di $message e passa la traduzione all'istruzione PHP return. Se non viene trovata una traduzione per $message, restituisce semplicemente $message.

Quindi, nel tuo caso, le due funzioni lavorano allo stesso modo:

apply_filters invierà a qualsiasi funzione di callback associata al filtro simplr-reg-instructions il valore tradotto (se esiste) di 'Please fill out this form to sign up for this site' utilizzando il dominio di testo simplr-reg.

6 mag 2011 19:23:12
Commenti

Bainternet, grazie mille! Come mai non riesco a trovare nessuna riga "add_filter( 'simplr-reg-instructions', " nei file del plugin?

Ash Ash
8 mag 2011 10:33:50

È un hook lasciato per gli sviluppatori che vogliono estendere o filtrare la funzionalità del plugin.

Bainternet Bainternet
8 mag 2011 10:55:19

Quindi add_filter non è previsto qui? Non capisco perché. apply_filters non dovrebbe eseguire tutte le funzioni associate al suo hook dalle funzioni add_filter?

Ash Ash
8 mag 2011 11:08:06

apply_filters è un segnaposto che ti permette di agganciare le tue funzioni personalizzate usando add_filter, quindi non ci si aspetta alcun add_filter a meno che tu non ne aggiunga uno tuo

Bainternet Bainternet
8 mag 2011 12:23:47