Rimozione azione tema genitore su funzione pluggable non funziona

28 lug 2020, 20:31:28
Visualizzazioni: 286
Voti: 0

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!

2
Commenti

Hai provato a posizionare il remove_action al di fuori della funzione 'remove'? Da solo nel tuo child theme > functions.php? Solo un'ipotesi... remove_action può essere complicato.

shanebp shanebp
28 lug 2020 20:42:29

@shanebp Sì, non fa nulla quando viene spostato fuori dalla funzione. Credo che per sovrascrivere la chiamata del tema genitore debba essere agganciato a init o after_theme_setup.

Michelle Michelle
28 lug 2020 21:05:25
Tutte le risposte alla domanda 2
2

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).

28 lug 2020 23:28:36
Commenti

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!

Michelle Michelle
29 lug 2020 00:17:30

Questo tema è disponibile per essere esaminato? Dare un'occhiata al codice o verificare effettivamente perché la chiamata remove_action fallisce utilizzando un debugger sarebbe il prossimo passo fondamentale per identificare il problema!

Bence Szalai Bence Szalai
29 lug 2020 14:56:28
4

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 .

28 lug 2020 20:57:56
Commenti

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!

Michelle Michelle
28 lug 2020 21:05:28

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 .

Rick Hellewell Rick Hellewell
29 lug 2020 00:03:13

L'ho provato, non ha funzionato.

Michelle Michelle
29 lug 2020 00:09:00

È 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 .

Rick Hellewell Rick Hellewell
30 lug 2020 01:50:41