Rimozione azione tema genitore su funzione pluggable non funziona
Sto cercando di rimuovere una chiamata add_action del tema genitore a una funzione pluggable, ma non riesco a farlo funzionare chiamando remove_action()
- devo ridefinire la funzione e lasciarla vuota. È normale? Pensavo di poter usare remove_action
per evitare semplicemente di chiamare la funzione.
Ecco il codice del tema genitore:
add_action( 'tha_content_while_before', 'fwp_archive_header' );
if ( !function_exists('fwp_archive_header') ) {
function fwp_archive_header() {
// fai qualcosa
}
}
E nel tema figlio (NON funziona):
add_action( 'init', 'remove_parent_actions_filters' );
function remove_parent_actions_filters() {
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
Ho anche provato a sostituire 'init
' con 'after_setup_theme
' e 'wp_loaded
'; ho anche provato a modificare la priorità, ma nulla ha funzionato. L'unica cosa che ha funzionato è stata questa:
Nel tema figlio (funziona):
function fwp_archive_header() {
// non fare nulla
}
Può essere corretto? Devo ridefinire la funzione per eliminarla?
Grazie!

Il file functions.php del tema genitore viene eseguito dopo quello del tema figlio, quindi per rimuovere un'azione definita dal tema genitore, la chiamata remove_action
deve essere ritardata utilizzando un hook dopo che il tema genitore ha registrato l'azione. Quindi inserire la chiamata remove_action
puramente nel functions.php del tema figlio non funzionerà. Deve essere collegata a un hook.
Tuttavia, dall'estratto del codice nella domanda non è chiaro se la riga del genitore add_action( 'tha_content_while_before', 'fwp_archive_header' );
sia solo in functions.php o sia all'interno di un'azione? Se è all'interno di un'azione, collega la chiamata remove_action
alla stessa azione ma con una priorità maggiore (in modo che venga eseguita dopo). Nota che sto parlando dell'azione in cui si trova la chiamata add_action
del genitore. Qualcosa come questo:
add_action( 'some_hook', 'some_parent_function', 10 );
function some_parent_function() {
/* ...qualche codice... */
add_action( 'tha_content_while_before', 'fwp_archive_header' );
if ( !function_exists('fwp_archive_header') ) {
function fwp_archive_header() {
// fai qualcosa
}
}
/* ...qualche codice... */
}
La rimozione sarebbe così:
add_action( 'some_hook', 'remove_parent_actions_filters', 11 );
function remove_parent_actions_filters() {
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
Un altro tentativo di regola empirica è collegare la tua chiamata di rimozione a wp_loaded
, ad esempio: add_action( 'wp_loaded', 'remove_parent_actions_filters', 1000 );
. Dovrebbe essere ancora in tempo per influenzare il rendering delle pagine, ma probabilmente abbastanza tardi da sovrascrivere gli hook più comuni del tema genitore.
D'altra parte, dichiarare una funzione vuota con il nome fwp_archive_header
è quasi una soluzione altrettanto valida. Nota però che non è "ridefinire", poiché in PHP non esiste una cosa del genere. È più come "pre-dichiarare", prima del tema genitore, in modo che il tema genitore non dichiari la propria funzione con lo stesso nome (con i controlli appropriati in atto).

Grazie! Capito. La funzione add_action( 'tha_content_while_before', 'fwp_archive_header' ); del tema genitore e la funzione associata si trovano in un file functions.php, non racchiusi in un'altra azione/funzione. Ho provato wp_loaded (e init, e after_setup_theme) con priorità 1000 ma nulla funziona. Molto strano. Immagino che dovrò semplicemente ridefinire la funzione come vuota. Grazie!

All'interno della tua funzione remove_parent_actions_filters(), aggiungi un test per verificare se la funzione del tema genitore è stata caricata. Forse stai chiamando il tuo hook troppo presto.
add_action( 'init', 'remove_parent_actions_filters' );
function remove_parent_actions_filters() {
if (!function_exists('fwp_archive_header')) {wp_die("La funzione fwp_archive_header non è caricata");}
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
Aggiunto
Prova a utilizzare l'hook after_setup_theme invece. Vedi https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

Questo è sicuramente un problema - ricevo il messaggio da wp_die quando uso il tuo codice. Ho provato a cambiare la priorità a qualcosa di molto alto come 1000 add_action( 'init', 'remove_parent_actions_filters',1000 ); ma continuo a ricevere il messaggio. Sono bloccato!

Quello che devi usare è l'hook che viene eseguito dopo il caricamento dello stile del tema genitore. O forse dopo che tutti i file di stile sono stati caricati. Come l'hook 'after_setup_theme': https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

È possibile che la funzione che stai cercando di sostituire venga caricata più tardi (dopo l'impostazione del tema)? Forse questo ti aiuterà: https://codex.wordpress.org/Plugin_API/Action_Reference . E questa potrebbe essere un'ottima risorsa (risposte) https://wordpress.stackexchange.com/questions/162862/how-to-get-wordpress-hooks-actions-run-sequence .
