Eliminar acción del tema padre en función pluggable no funciona
Estoy intentando eliminar la llamada add_action de un tema padre a una función pluggable, pero no consigo que funcione llamando a remove_action()
- tengo que redeclarar la función y dejarla vacía. ¿Es esto normal? Pensé que podría usar remove_action
para simplemente no llamar a la función.
Aquí está el código del tema padre:
add_action( 'tha_content_while_before', 'fwp_archive_header' );
if ( !function_exists('fwp_archive_header') ) {
function fwp_archive_header() {
// hacer cosas
}
}
Y en el tema hijo (NO funciona):
add_action( 'init', 'remove_parent_actions_filters' );
function remove_parent_actions_filters() {
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
También he probado cambiar 'init
' por 'after_setup_theme
' y 'wp_loaded
'; también he probado a bajar y subir la prioridad, nada funcionó. Lo único que funcionó fue esto:
En el tema hijo (funciona):
function fwp_archive_header() {
// no hacer nada
}
¿Puede ser correcto que tenga que redeclarar la función para eliminarla?
¡Gracias!

El functions.php del tema padre se ejecuta después del del tema hijo, por lo que para eliminar una acción definida por el tema padre, la llamada remove_action
debe retrasarse usando un hook después de que el tema padre registre la acción. Así que poner la llamada remove_action
únicamente dentro del functions.php del hijo no funcionará. Debe adjuntarse a un hook.
Sin embargo, en el fragmento de código de la pregunta no está claro si la línea add_action( 'tha_content_while_before', 'fwp_archive_header' );
del padre está solo en functions.php o está dentro de una acción. Si está dentro de una acción, engancha la llamada remove_action
a la misma acción pero con mayor prioridad (para que se ejecute después). Nota: estoy hablando de la acción dentro de la cual está la llamada add_action
del padre. Algo así:
add_action( 'some_hook', 'some_parent_function', 10 );
function some_parent_function() {
/* ...algún código... */
add_action( 'tha_content_while_before', 'fwp_archive_header' );
if ( !function_exists('fwp_archive_header') ) {
function fwp_archive_header() {
// hacer algo
}
}
/* ...algún código... */
}
La eliminación se vería así:
add_action( 'some_hook', 'remove_parent_actions_filters', 11 );
function remove_parent_actions_filters() {
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
Otra regla general es enganchar tu llamada de eliminación a wp_loaded
, por ejemplo: add_action( 'wp_loaded', 'remove_parent_actions_filters', 1000 );
. Debería estar a tiempo para afectar cómo se renderizan las páginas, pero probablemente sería lo suficientemente tarde como para anular la mayoría de los hooks comunes del tema padre.
Por otro lado, declarar una función vacía con el nombre fwp_archive_header
es casi una solución tan buena. Aunque ten en cuenta que no es "redeclarar", ya que no existe tal cosa en PHP. Es más bien "predeclarar", antes que el tema padre, para que el tema padre no declare su propia función con el mismo nombre (con las comprobaciones adecuadas en su lugar).

¡Gracias! Entendido. El add_action( 'tha_content_while_before', 'fwp_archive_header' ); del tema padre y la función asociada están en un archivo functions.php, no envueltos en otra acción/función. Probé wp_loaded (y init, y after_setup_theme) con prioridad 1000 y nada funciona. Muy extraño. Supongo que simplemente redeclararé la función como vacía. ¡Gracias!

Dentro de tu función remove_parent_actions_filters(), añade una prueba para ver si la función del tema padre ha sido cargada. Quizás estás llamando a tu hook demasiado pronto.
add_action( 'init', 'remove_parent_actions_filters' );
function remove_parent_actions_filters() {
if (!function_exists('fwp_archive_header')) {wp_die("La función fwp_archive_header no está cargada");}
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
Añadido
Intenta usar el hook after_setup_theme en su lugar. Consulta https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

Definitivamente eso es un problema - recibo el mensaje de wp_die cuando uso tu código. He intentado cambiar la prioridad a algo muy alto como 1000 add_action( 'init', 'remove_parent_actions_filters',1000 ); pero aún así obtengo el mensaje. ¡Estoy atascado!

Lo que necesitas usar es el hook que ocurre después de que se cargue el estilo padre. O quizás después de que todos los archivos de estilo se carguen. Como el hook 'after_setup_theme': https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

¿Es posible que la función que intentas reemplazar se cargue más tarde (después de la configuración del tema)? Tal vez esto ayude: https://codex.wordpress.org/Plugin_API/Action_Reference . Y este podría ser un gran recurso (respuestas) https://wordpress.stackexchange.com/questions/162862/how-to-get-wordpress-hooks-actions-run-sequence .
