Cum să elimini acțiunea temei părinte pe o funcție pluggable care nu funcționează

28 iul. 2020, 20:31:28
Vizualizări: 286
Voturi: 0

Încerc să elimin un apel add_action al temei părinte către o funcție pluggable, dar nu reușesc să funcționeze prin apelarea remove_action() - trebuie să redeclarez funcția și să o las goală. Este normal? Mă gândesc că aș putea folosi remove_action pentru a nu apela niciodată funcția.

Iată codul din tema părinte:

add_action( 'tha_content_while_before', 'fwp_archive_header' );
if ( !function_exists('fwp_archive_header') ) {
    function fwp_archive_header() {
      // faci ceva
    }
}

Și în tema copil (NU funcționează):

add_action( 'init', 'remove_parent_actions_filters' );
function remove_parent_actions_filters() { 
  remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}

Am încercat și să înlocuiesc 'init' cu 'after_setup_theme' și 'wp_loaded'; am încercat și să modific prioritatea, dar nimic nu a funcționat. Singurul lucru care a funcționat a fost acesta:

În tema copil (funcționează):

function fwp_archive_header() {
  // nu faci nimic
}

Este corect să trebuiască să redeclarez funcția pentru a scăpa de ea?

Mulțumesc!

2
Comentarii

Ai încercat să plasezi remove_action în afara funcției 'remove'? Direct în fișierul copil al temei > functions.php? Doar o presupunere... remove_action poate fi dificil de utilizat.

shanebp shanebp
28 iul. 2020 20:42:29

@shanebp Da, nu face nimic când este mutat în afara funcției. Cred că pentru a suprascrie apelul din tema părinte, trebuie conectat fie la init, fie la after_theme_setup.

Michelle Michelle
28 iul. 2020 21:05:25
Toate răspunsurile la întrebare 2
2

Fișierul functions.php al temei părinte rulează după cel al temei copil, așa că pentru a elimina o acțiune definită de tema părinte, apelul remove_action trebuie întârziat folosind un hook după ce tema părinte înregistrează acțiunea. Prin urmare, plasarea apelului remove_action doar în functions.php al temei copil nu va funcționa. Acesta trebuie atașat unui hook.

Totuși, din fragmentul de cod din întrebare, nu este clar dacă linia add_action( 'tha_content_while_before', 'fwp_archive_header' ); a temei părinte este doar în functions.php sau este inclusă într-o acțiune. Dacă este inclusă într-o acțiune, conectați apelul remove_action la aceeași acțiune, dar cu o prioritate mai mare (astfel încât să ruleze după). Vă referiți la acțiunea în care se află apelul add_action al temei părinte. Ceva de genul:

add_action( 'some_hook', 'some_parent_function', 10 );
function some_parent_function() {
    /* ...niște cod... */
    add_action( 'tha_content_while_before', 'fwp_archive_header' );
    if ( !function_exists('fwp_archive_header') ) {
        function fwp_archive_header() {
          // faci niște operații
        }
    }
    /* ...niște cod... */
}

Eliminarea ar arăta astfel:

add_action( 'some_hook', 'remove_parent_actions_filters', 11 );
function remove_parent_actions_filters() { 
  remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}

O altă regulă generală este să conectați apelul de eliminare la wp_loaded, de exemplu: add_action( 'wp_loaded', 'remove_parent_actions_filters', 1000 );. Ar trebui să fie încă la timp pentru a afecta modul în care sunt randate paginile, dar ar trebui să fie suficient de târziu pentru a suprascrie majoritatea hook-urilor comune ale temei părinte.


Pe de altă parte, declararea unei funcții goale cu numele fwp_archive_header este aproape la fel de bună ca soluție. Rețineți totuși că nu este „redeclarare”, deoarece nu există așa ceva în PHP. Este mai degrabă „predeclarare”, înainte de tema părinte, astfel încât tema părinte să nu-și declare propria funcție cu același nume (cu verificări adecvate în loc).

28 iul. 2020 23:28:36
Comentarii

Mulțumesc! Am înțeles. Acțiunea add_action( 'tha_content_while_before', 'fwp_archive_header' ) din tema părinte și funcția asociată se află într-un fișier functions.php, neîncapsulată într-o altă acțiune/funcție. Am încercat wp_loaded (și init, și after_setup_theme) cu prioritate 1000 și nimic nu funcționează. Foarte ciudat. Cred că voi redeclara funcția ca fiind goală. Mulțumesc!

Michelle Michelle
29 iul. 2020 00:17:30

Este această temă disponibilă pentru examinare? A verifica codul sau a analiza de ce apelul remove_action eșuează folosind un debugger ar fi următorul pas în identificarea problemei!

Bence Szalai Bence Szalai
29 iul. 2020 14:56:28
4

În funcția ta remove_parent_actions_filters(), adaugă un test pentru a verifica dacă funcția temei părinte a fost încărcată. Poate apelezi hook-ul prea devreme.

add_action( 'init', 'remove_parent_actions_filters' );
function remove_parent_actions_filters() { 
   if (!function_exists('fwp_archive_header')) {wp_die("Funcția fwp_archive_header nu este încărcată");}
  remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}

Adăugat

Încearcă să folosești hook-ul after_setup_theme în loc. Vezi https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

28 iul. 2020 20:57:56
Comentarii

Cu siguranță asta este o problemă - primesc mesajul de la wp_die când folosesc codul tău. Am încercat să schimb prioritatea la ceva foarte mare precum 1000 add_action( 'init', 'remove_parent_actions_filters',1000 ); dar tot primesc mesajul. Sunt blocat!

Michelle Michelle
28 iul. 2020 21:05:28

Ceea ce trebuie să folosești este hook-ul care apare după ce stilul părintelui este încărcat. Sau poate după ce toate fișierele de stil sunt încărcate. Ca de exemplu hook-ul 'after_setup_theme': https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

Rick Hellewell Rick Hellewell
29 iul. 2020 00:03:13

Am încercat asta, nu a funcționat.

Michelle Michelle
29 iul. 2020 00:09:00

Este posibil ca funcția pe care încerci să o înlocuiești să se încarce mai târziu (după configurarea temei)? Poate acest lucru te va ajuta: https://codex.wordpress.org/Plugin_API/Action_Reference . Și aceasta ar putea fi o resursă excelentă (răspunsuri) https://wordpress.stackexchange.com/questions/162862/how-to-get-wordpress-hooks-actions-run-sequence .

Rick Hellewell Rick Hellewell
30 iul. 2020 01:50:41