Eliminar acción de un plugin en otro plugin
Estoy tratando de eliminar dos de las acciones que agrega un plugin (específicamente sportspress). Las acciones de este plugin son:
add_action('sportspress_before_single_player','sportspress_output_player_details', 15);
add_action('sportspress_single_player_content','sportspress_output_player_statistics',20);
He creado un plugin y quiero eliminar estos hooks, este es mi código:
<?php
/*
Plugin Name: mi plugin
Description: Plugin para anular hooks de otros plugins
Version: 0.1
Author: Nombre de la Compañía
Author URI: http://www.example.com/
License: GPL2
*/
add_action('plugins_loaded','remove_hooks');
function remove_hooks(){
remove_action( 'sportspress_before_single_player', 'sportspress_output_player_details' );
remove_action( 'sportspress_single_player_content', 'sportspress_output_player_statistics' );
}
He buscado y probado muchas cosas, pero no puedo hacer que funcione.
Hay dos cosas que confunden a las personas cuando intentan eliminar un hook:
- Las llamadas
remove_action()
oremove_filter()
deben ocurrir después de las llamadasadd_action()
oadd_filter()
, y antes de que el hook se ejecute realmente. Esto significa que debes conocer el hook cuando se agregaron las llamadas y cuándo se dispara el hook. - Las llamadas
remove_action()
oremove_filter()
deben tener la misma prioridad que la llamadaadd_action()
oadd_filter()
.
Si estos hooks se agregaron en el filtro init con la prioridad predeterminada, entonces para eliminarlos, simplemente nos enganchamos a init con una prioridad mayor a 10 y los eliminamos.
add_action( 'init', 'wpse_106269_remove_hooks', 11 );
function wpse_106269_remove_hooks(){
remove_action( 'sportspress_before_single_player', 'sportspress_output_player_details', 15 );
remove_action( 'sportspress_single_player_content', 'sportspress_output_player_statistics', 20 );
}
De https://codex.wordpress.org/Function_Reference/remove_action
Importante: Para eliminar un hook, los argumentos $function_to_remove y $priority deben coincidir con los que se usaron cuando se agregó el hook. Esto aplica tanto para filtros como para acciones. No se mostrará ninguna advertencia si falla la eliminación.

Tenía el mismo problema. Quería eliminar una acción que provenía de otro plugin y reemplazarla con otra función que escribí en el plugin que estaba desarrollando, pero el nombre de mi archivo (como dijo @Sumit) estaba después del archivo del plugin original en orden alfabético. Aun así, pude eliminar la acción.
Lo que funcionó para mí fue envolver mi llamada a remove_action
dentro de otro add_action para ejecutarla después de que se cargaran todos los plugins. Esto es posible usando la acción init:
add_action( 'init', 'cambiarAcciones' );
function cambiarAcciones () {
remove_action('my_action', 'la_funcion_del_plugin', 10);
}
P.D.: Si quieres ver si las acciones se eliminaron correctamente, puedes imprimir en algún lugar las funciones enganchadas a la acción que deseas usando el código de esta respuesta. Usé un shortcode de prueba, ya que no estaba trabajando con los archivos del tema (solo agrega [test_actions]
en cualquier página dentro del panel de WordPress).
add_shortcode('test_actions', 'probarAcciones');
function probarAcciones($attrs) {
//obtener la lista de todas las acciones usando esta variable global
global $wp_filter;
//obtener solo las acciones enganchadas a 'my_action'
$r = $wp_filter['my_action'];
//devolver el volcado del array como una cadena
return var_export($r, TRUE);
}

Los plugins se cargan en el orden de sus nombres de archivo. Por ejemplo, el plugin con nombre abc.php
se carga primero y luego xyz.php
. Por lo tanto, si estás intentando eliminar una acción del plugin abc.php
y esa acción fue agregada en el plugin xyz.php
, no será posible sin algún ajuste. Porque la acción nunca se agregó en el momento en que intentas eliminarla.
Puedes simplemente colocar un die(__FILE__);
en ambos plugins para ver cuál muestra la salida primero. Si tu plugin se carga antes, puedes hacer dos cosas para eliminar la acción:
- Renombrar tu plugin para que se cargue después del plugin objetivo.
- No estoy seguro de cuándo se ejecutan las acciones principales, pero hay una larga lista de acciones Referencia de Acciones en las que puedes enganchar la eliminación de la acción en tu plugin. Ahora sabes cuándo colocar
remove_action()
para que sea efectivo.
Espero que esto ayude.

Agregué el die
, y el primer plugin cargado es el "padre", así que no debería haber problema con el orden de carga de los plugins

Sí, entonces no debería haber problema, elimina la acción plugins_loaded
y coloca directamente el remove_action
en tu plugin con la misma prioridad, funcionará según la estructura de código que has compartido.
