Eliminar acción del tema padre en función pluggable no funciona

28 jul 2020, 20:31:28
Vistas: 286
Votos: 0

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!

2
Comentarios

¿Has intentado colocar el remove_action fuera de la función 'remove'? Por sí solo en tu tema hijo > functions.php? Solo estoy adivinando... remove_action puede ser complicado.

shanebp shanebp
28 jul 2020 20:42:29

@shanebp Sí, no hace nada cuando se mueve fuera de la función. Creo que para anular la llamada del tema padre debe estar enganchado a init o after_theme_setup.

Michelle Michelle
28 jul 2020 21:05:25
Todas las respuestas a la pregunta 2
2

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

28 jul 2020 23:28:36
Comentarios

¡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!

Michelle Michelle
29 jul 2020 00:17:30

¿Está disponible este tema para examinarlo? ¡Mirar el código o verificar realmente por qué falla la llamada remove_action usando un depurador sería el siguiente paso para encontrar el problema!

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

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 .

28 jul 2020 20:57:56
Comentarios

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!

Michelle Michelle
28 jul 2020 21:05:28

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 .

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

Lo intenté, no funcionó.

Michelle Michelle
29 jul 2020 00:09:00

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

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