从其他插件上的插件中删除操作

时间:2016-04-14 作者:Alex

我正在尝试删除添加插件的两个操作(特别是sportspress)。这些插件的作用是:

add_action(\'sportspress_before_single_player\',\'sportspress_output_player_details\', 15);
add_action(\'sportspress_single_player_content\',\'sportspress_output_player_statistics\',20);
我已经创建了一个插件,我想删除这些挂钩,这是我的代码:

<?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\' );
}
我已经搜索和尝试了很多东西,但我无法让它工作。

3 个回复
SO网友:Nathan Johnson

在尝试移除挂钩时,有两件事会让人困惑:

remove_action()remove_filter() 通话必须在add_action()add_filter() 在实际触发挂钩之前调用、。这意味着您必须知道添加调用时的钩子,以及触发钩子时的钩子

  • remove_action()remove_filter() 呼叫的优先级必须与add_action()add_filter() 如果这些钩子是以默认优先级添加到init过滤器上的,则调用,然后要删除它们,我们只需以10之后的优先级钩住init并删除它们。

    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 );
    }
    
    发件人https://codex.wordpress.org/Function_Reference/remove_action

    Important: 要删除挂钩,添加挂钩时,$function\\u To\\u remove和$priority参数必须匹配。这适用于过滤器和操作。移除失败时不会发出警告

  • SO网友:Brian Hellekin

    我也有同样的问题。我想删除来自另一个插件的一个操作,并用我在开发的插件中编写的另一个函数替换它,但我的文件名(正如@Sumit所说)按字母顺序排在原始插件文件之后。尽管如此,我还是能够取消这个动作。

    对我有用的是remove_action 在另一个add\\u操作中调用,以便在加载完插件后运行它。这可以通过使用操作实现init:

    add_action( \'init\', \'changeActions\' );
    function changeActions () {
        remove_action(\'my_action\', \'the_function_from_the_plugin\', 10);
    }
    
    P.S.:如果要查看操作是否已正确删除,可以使用中的代码打印与所需操作挂钩的函数this answer. 我使用了一个测试短代码,因为我没有使用主题文件(只需添加[test_actions] 在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);
    }
    

    SO网友:Sumit

    插件按照文件名的顺序加载。e、 g.名为的插件abc.php 先加载,然后xyz.php 因此,如果您试图从插件中删除操作abc.php 这是在插件中添加的xyz.php 那么,没有任何调整是不可能的。因为在您尝试删除操作时从未添加该操作。

    您只需放置die(__FILE__); 在两个插件中,查看哪一个先回显输出。如果插件的加载时间早于此,则可以通过两种方式删除此操作

    重命名插件并在实际插件后加载Action_Reference 您可以在其上钩住插件中的删除操作。现在你知道什么时候remove_action() 使其有效

    相关推荐

    Can I make plugins required?

    我正在开发自己的Wordpress主题,将用于多个客户端。它有一个主题选项页面,这样我每次都可以轻松自定义网站,但我也会在我制作的每个网站上使用一些插件(如SEO插件、安全性等)。有没有办法让它们成为“必需的”,这样我就可以得到这些插件的列表,这样当我在新网站上安装主题时就不必在插件目录中找到它们了?