Differenza tra do_action e add_action
Questa domanda potrebbe essere sbagliata, non ne sono sicuro. Perché non ho le idee chiare su questo.
So che add_action viene utilizzato per agganciare la nostra funzione alla funzione specificata. Per esempio add_action('wp_head','myfunc'); ora qualsiasi codice in myfunc verrà eseguito in wp_head(). Questo è chiaro ma ho dei dubbi su do_action, cosa fa?
Penso che venga utilizzato per creare i nostri hook personalizzati come quelli già disponibili (wp_head, wp_footer, ecc.). Se ho ragione, qualcuno può mostrarmi una risposta semplice e comprensibile con un esempio basilare?
Ho cercato la differenza su internet ma tutti fanno riferimento alla differenza tra add_action e add_filter. Non voglio andare lì perché prima voglio chiarire questo e poi passerò a quello.
Qualcuno può aiutarmi?
MODIFICA dopo la pubblicazione della domanda
function custom_register()
{
echo '<script>jQuery(document).ready(function(){alert("Imparando gli Hook");});</script>';
}
do_action('custom');
add_action('custom','custom_register');
Ho provato questo nel plugin ma non ho ricevuto il messaggio di alert.
Ma quando aggancio la stessa funzione con wp_head allora funziona correttamente
/******************funzionante****************/
add_action('wp_head','custom_register');
Usa do_action( 'nome_univoco' ) per creare le tue azioni personalizzate.
Puoi utilizzarlo per offrire un'API per il tuo plugin, così altri plugin possono registrare callback per la tua azione personalizzata. Esempio: Devo chiamare do_action nel mio plugin?
Ma puoi utilizzare azioni personalizzate (o filtri) anche in un tema. Esempio: Miglior modo per implementare sezioni personalizzate in un tema WordPress
E puoi combinarli entrambi per far lavorare insieme un plugin e un tema. Esempio: Come rendere disponibile un metodo del plugin nel tema?
Riassunto: add_action( 'foo' ) registra una callback, do_action( 'foo' ) esegue quella callback registrata.
Grazie per l'aiuto, questo è principalmente per scopi API. Ho provato un esempio ma non ha funzionato. Riesci a trovare qualche problema? Controlla il mio EDIT @toscho
sun
Possiamo considerarlo un altro caso simile all'ereditarietà? Invece di estendere e sovrascrivere la classe, stiamo procedendo in questo modo. È corretto?
sun
@sun Hm, sì, ma puoi combinare entrambi gli approcci, non si escludono a vicenda.
fuxia
Questa è la mia supposizione, quindi se sai qualcosa di meglio, per favore lascia un commento così posso aggiornare la mia ipotesi.
Il codice del tuo plugin viene eseguito prima di wp_head() (che possiamo assumere invocherà le azioni aggiunte ad esso). Quando usi add_action('wp_head','custom_register'), stai dicendo a PHP che quando (in futuro) verrà chiamato do_action('wp_head'), dovrà anche chiamare custom_register(). Lo stesso vale per la tua chiamata a add_action('custom','custom_register'), ma come vedi nel tuo codice, la chiamata a do_action('custom') è già stata fatta, e quando è stata chiamata, non c'era ancora nessuna azione aggiunta ad essa.
Ecco perché Toscho ha chiesto cosa succede quando chiami do_action('custom') dopo aver registrato il callback. La tua risposta riguardo al back end e front end è ambigua. Se inverti le ultime due righe nel seguente codice, penso che funzionerà:
function custom_register()
{
echo '<script>jQuery(document).ready(function(){alert("Learning Hooks");});</script>';
}
do_action('custom'); // Questa viene chiamata prima che possa avere effetto.
add_action('custom','custom_register'); // Troppo tardi - do_action è già stato chiamato.
do_action: Registra un hook di azione mentre
add_action: aggiunge una funzione di callback all'hook registrato.
Esempio
Supponi di voler stampare qualcosa prima della sidebar nel tuo template.
- Aggiungerai un hook di azione nel tuo file template
index.phptramite<?php add_action('bp_sidebar_left'); ?>. - Ora nel tuo file
functions.phppuoi aggiungere una funzione di callback a quell'hook per stampare ciò che desideri.
add_action('bp_sidebar_left', 'bp_sidebar_left_cb');
function bp_sidebar_left_cb() {
echo 'Ciao Mondo!';
}
Devi utilizzare come mostrato di seguito:
function custom_register()
{
echo '<script>jQuery(document).ready(function(){alert("Imparando gli Hook");});</script>';
}
.
add_action('custom','custom_register'); // Troppo tardi - do_action è già stato chiamato.
do_action('custom'); // Questo viene chiamato prima che possa avere effetto