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

Possiamo considerarlo un altro caso simile all'ereditarietà? Invece di estendere e sovrascrivere la classe, stiamo procedendo in questo modo. È corretto?

@sun Hm, sì, ma puoi combinare entrambi gli approcci, non si escludono a vicenda.

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.php
tramite<?php add_action('bp_sidebar_left'); ?>
. - Ora nel tuo file
functions.php
puoi 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
