Cum să elimini acțiunea temei părinte pe o funcție pluggable care nu funcționează
Î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!

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

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!

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

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!

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 .

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 .
