Eliminar acción de un plugin en otro plugin

14 abr 2016, 11:45:21
Vistas: 22.4K
Votos: 9

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.

9
Comentarios

¡No existe el concepto de plugin hijo en WordPress!

Sumit Sumit
14 abr 2016 11:51:29

¡Entonces Google me mintió! Actualizaré el título entonces

Alex Alex
14 abr 2016 11:52:06

¡Genial! Ahora proporciona más detalles sobre en qué contexto se agregan las acciones, como en el constructor de una clase, directamente en un archivo o alguna acción de WordPress, también asigna la misma prioridad para eliminar acciones, por ejemplo, 15 y 20

Sumit Sumit
14 abr 2016 11:56:04

Las acciones se agregan en el constructor del plugin (el constructor llama a una función llamada 'includes', y esta función hace "include_once" del archivo con todos los hooks). Intenté mantener también las prioridades, pero no funcionó.

Alex Alex
14 abr 2016 11:58:21

Solo una suposición: ¿el plugin está generando la salida en el área reservada para el contenido de entradas y páginas? Esto suele ser común en plugins que trabajan con sus propios tipos de contenido personalizados para garantizar compatibilidad con diferentes temas. ¿Has probado usar the_content como hook en lugar de plugins_loaded?

Luis Sanz Luis Sanz
14 abr 2016 12:16:15

Sí, intenté usar the_content, pero tampoco funciona

Alex Alex
14 abr 2016 12:19:19

Entonces, ¿el plugin está envuelto en una clase? En ese caso, podrías tener que acceder primero a la clase con global $pluginsClass y pasarla dentro de la acción remove así remove_action( 'sportspress_before_single_player', array( $pluginsClass, 'sportspress_output_player_details' ) );.

Luis Sanz Luis Sanz
14 abr 2016 12:23:03

@LuisSanz Todavía soy principiante con WordPress, ¿podrías explicarme cómo acceder a la clase del plugin?

Alex Alex
14 abr 2016 13:24:00

Bueno, reinicié el servidor y ahora está funcionando.

Alex Alex
15 abr 2016 11:28:38
Mostrar los 4 comentarios restantes
Todas las respuestas a la pregunta 3
0
18

Hay dos cosas que confunden a las personas cuando intentan eliminar un hook:

  1. Las llamadas remove_action() o remove_filter() deben ocurrir después de las llamadas add_action() o add_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.
  2. Las llamadas remove_action() o remove_filter() deben tener la misma prioridad que la llamada add_action() o add_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.

15 feb 2017 20:56:00
1

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);
}
25 sept 2016 11:18:10
Comentarios

¡Eso también funcionó para mí!

Jono Jono
21 sept 2023 19:40:19
3

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:

  1. Renombrar tu plugin para que se cargue después del plugin objetivo.
  2. 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.

14 abr 2016 12:24:50
Comentarios

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

Alex Alex
14 abr 2016 13:21:43

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.

Sumit Sumit
14 abr 2016 14:11:08

Pero es una mala práctica renombrar un plugin para que se ejecute después de otro plugin, podría haber otra forma de lograrlo como sugirió @brian-hellekin

Sagar Guhe Sagar Guhe
30 oct 2019 10:09:29