web-dev-qa-db-fra.com

Supprimer l'action du plugin sur un autre plugin

J'essaie de supprimer deux des actions qui ajoutent un plugin (sportspress en particulier). Les actions de ces plugins sont:

add_action('sportspress_before_single_player','sportspress_output_player_details', 15);
add_action('sportspress_single_player_content','sportspress_output_player_statistics',20);

J'ai créé un plugin, et je veux supprimer ces hooks, voici mon code:

<?php
/*
Plugin Name: my plugin

Description: Plugin to override plugins' hooks
Version: 0.1
Author: Company Name
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' );
}

J'ai cherché et essayé beaucoup de choses, mais je ne peux pas le faire fonctionner.

4
Doruko

Il y a deux choses qui déroutent les gens qui essaient de retirer un crochet:

  1. Les appels remove_action() ou remove_filter() doivent avoir lieu après les appels add_action() ou add_filter(), et _ avant que le raccordement ne soit effectivement déclenché. Cela signifie que vous devez connaître le raccordement lorsque les appels ont été ajoutés et lorsque le raccordement est activé.
  2. Les appels remove_action() ou remove_filter() doivent avoir la même priorité que les appels add_action() ou add_filter()

Si ces points d'ancrage étaient ajoutés au filtre init avec la priorité par défaut, nous les accrocherions à init avec une priorité supérieure à 10 et les supprimerions.

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

Important _ : Pour supprimer un hook, les arguments $ function_to_remove et $ priority doivent correspondre lors de l'ajout du hook. Ceci s'applique aux filtres et aux actions. Aucun avertissement ne sera donné. en cas d'échec de l'enlèvement.

6
Nathan Johnson

Les plugins sont chargés dans l'ordre de leurs noms de fichiers. par exemple. plugin avec le nom abc.php chargé en premier, puis xyz.php donc si vous essayez de supprimer une action du plugin abc.php et que celle-ci a été ajoutée au plugin xyz.php, il n’est pas possible sans Tweak. Parce que l'action n'a jamais été ajoutée au moment où vous essayez de la supprimer.

Vous pouvez simplement placer un die(__FILE__); dans les deux plugins pour voir lequel renvoie en premier la sortie. Si votre plugin est chargé plus tôt que prévu, vous pouvez faire deux choses pour supprimer l’action.

  1. Renommez votre plugin et chargez-le après le plugin actuel.
  2. Je ne sais pas quand les actions parent sont exécutées, mais il existe une longue liste d'actions Action_Reference sur lesquelles vous pouvez accrocher une action remove dans votre plugin. Vous savez maintenant quand placer remove_action() pour le rendre efficace.

J'espère que ça aide.

2
Sumit

J'étais avec le même problème. Je voulais supprimer une action provenant d'un autre plugin et la remplacer par une autre fonction que j'avais écrite dans le plugin que je développais, mais mon nom de fichier (comme @Sumit l'a dit) était après le fichier du plugin d'origine dans l'ordre alphabétique. Malgré tout, j'ai pu supprimer l'action.

Ce qui a fonctionné pour moi, c’est de placer mon appel remove_action dans un autre add_action et de le lancer après le chargement du plug-in. Cela est possible en utilisant l’action init :

add_action( 'init', 'changeActions' );
function changeActions () {
    remove_action('my_action', 'the_function_from_the_plugin', 10);
}

P.S .: Si vous voulez voir si les actions ont été correctement supprimées, vous pouvez imprimer quelque part les fonctions rattachées à l’action souhaitée à l’aide du code de cette réponse . J'ai utilisé un shortcode de test, étant donné que je ne travaillais pas avec les fichiers de thème (ajoutez simplement [test_actions] dans une page du panneau wordpress).

add_shortcode('test_actions', 'testActions');
function testActions($attrs) {
    //get the list of all actions using this global variable
    global $wp_filter;

    //get only the actions hooked to 'my_action'
    $r = $wp_filter['my_action'];

    //return the array dump as a string
    return var_export($r, TRUE);
}
1
Brian Hellekin