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.
Il y a deux choses qui déroutent les gens qui essaient de retirer un crochet:
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é.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.
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.
remove_action()
pour le rendre efficace.J'espère que ça aide.
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);
}