删除/注销或隐藏由插件添加的小部件

时间:2014-06-04 作者:Bryan Willis

我想知道如何删除插件添加的wordpress小部件。我知道有几个插件可以做到这一点,比如https://wordpress.org/plugins/wp-remove-widgets/https://wordpress.org/plugins/post-lists-view-custom/, 然而,对于这样一个看起来很小的任务,我不想使用单独的插件。

具体来说,我正在尝试注销由widget驱动的wordpress引擎http://wpengine.com/ 加载widgets页面。我搜索了源代码,发现小部件的id是wpe_widget_powered_by

但是,这不起作用。。。

function my_widgets_init() {
    unregister_widget( \'wpe_widget_powered_by\' );
}
add_action(\'widgets_init\', \'my_widgets_init\');  
到目前为止,我唯一能有效地做的就是使用css/js的组合来隐藏然后删除小部件。我使用css在页面加载时隐藏它,然后用jquery删除它,这样小部件就不会出现空白。

function remove_wpe_powered_by_widget() {
?>
<style type="text/css">
    [id*="wpe_widget_powered_by"] {
display: none;
}
</style>
<script type="text/javascript">
    jQuery(document).ready(function($) {
    $("div[id$=\'wpe_widget_powered_by\']").remove();
    });
</script>
<?php
}
add_action( \'admin_head\', \'remove_wpe_powered_by_widget\' );
虽然上述方法可行,但我知道这不是正确的方法,我想知道为什么第一个函数不起作用。抄本上说要做到以下几点。

<?php unregister_widget( $widget_class ) ?>
也许我不明白$widget\\u类到底是什么。有没有一种方法可以在不搜索插件代码的情况下找到widget类?或者我是否已经有了正确的类,但由于另一个原因(可能是延迟挂钩或其他原因)它不起作用。

我浏览了stackexchange和internet,只能找到删除默认小部件的方法,但没有人告诉你如何删除插件添加的小部件。抱歉,如果我遗漏了什么,这是一个明显的问题。

2 个回复
最合适的回答,由SO网友:Bryan Willis 整理而成

谢谢Stephen今天帮我解决这个问题。尽管它很小,但我绝对讨厌开发人员用你不想要的垃圾塞满插件。在WPengine之后,我非常沮丧,告诉我它不能被删除,如果我真的想删除它,那么我需要在MU Plugins文件夹中找到该函数并删除它。从一家“Wordpress”托管公司那里听说他们的解决方案是删除代码,这与Wordpress的运行方式正好相反,这有点令人难过。

无论如何,我成功地创建了一个调试函数来打印注册的小部件。这是:

function show_widget_classes() {
    global $wp_registered_widgets; 
    $widgets = array(); 
    if(is_array($wp_registered_widgets)){ 
        foreach($wp_registered_widgets as $widg){ 
            if(!empty($widg[\'callback\'])){
                if(!empty($widg[\'callback\'][0])){  
                    $class = get_class($widg[\'callback\'][0]);
                    if(!array_key_exists($class, $widgets)){
                        $widgets[$class] = $widg[\'callback\'][0]->name;
                    }
                }
            }
        }
    }
foreach($widgets as $widget_class  => $widget_title ){
        echo \'<pre>\'; print_r( $widget_class ); echo \'</pre>\';
    }
}
add_action( \'admin_notices\', \'show_widget_classes\' ); 
具有讽刺意味的是,wpengine\\u powered\\u是唯一一个没有出现的。起初,我认为这与过早在mu plugins文件夹中加载wpengine小部件有冲突。然而,在重新阅读您对课程的回答后:

class [Widget Class] extends WP_Widget{
 ...
}
我在wpengine common plugins文件夹中快速搜索了extends WP\\u小部件:

grep -nr \'extends WP_Widget\' /wpengine-common  
什么都没有!因此,为了达到目的,我最终只搜索了插件,并意识到它们使用的是一个旧函数,该函数注册一个只在一个实例中包含单词的小部件。使用此方法时,不会使用类。

http://codex.wordpress.org/Function_Reference/wp_register_sidebar_widget

因此,与此相反:

unregister_widget
您可以使用以下选项:

wp_unregister_sidebar_widget
您还可以使用:

wp\\u unregister\\u widget\\u control用于使用wp\\u register\\u widget\\u控件添加控件的函数

这里是为其他对wpengines“附属”小部件感到厌烦的人删除小部件的最后一个函数。

<?php
/**
* Plugin Name: Remove WpEngine Bloat
* Plugin URI: http://wordpress.stackexchange.com/questions/147602/
* Description: Remove the affiliate links widget from the Admin Widgets Page.
* Version: 1.0
* Author: Bryan WIllis
* Author URI: 
* License:
*/

function remove_unwanted_wpe_bloat_affiliate_widget_wpse_147602() {
// unregister the widget and its control
   wp_unregister_sidebar_widget(\'wpe_widget_powered_by\');
}
add_action(\'widgets_init\', \'remove_unwanted_wpe_bloat_affiliate_widget_wpse_147602\', 1);
我还将在有机会时更新调试功能,并确保输出所有小部件,而不仅仅是使用类的小部件。

或者,下载https://wordpress.org/plugins/post-lists-view-custom/ 它允许您删除小部件,但是它有一些缺陷,如果您只是想删除小部件,它还添加了大量其他内容。

SO网友:Stephen Harris

如果看不到WPEngine用于执行此操作的代码,这部分是猜测工作

您必须删除小部件的代码是正确的,但是您只能在小部件注册后才能注销它。因此,请尝试将您的回调推到队列的后面:

function wpse147602_deregister_widget() {
    unregister_widget( \'wpe_widget_powered_by\' );
}
add_action( \'widgets_init\', \'wpse147602_deregister_widget\', 99999 );  
有没有一种方法可以在不搜索插件代码的情况下找到widget类?

。。。我是否已经有了正确的课程。。。?

大概Widgets是的php子类WP_Widget. 参数传递给unregister_widget() 应该是该子类的名称。E、 g。[Widget Class] 在下面

class [Widget Class] extends WP_Widget{
 ...
}
这是传递给register_widget().

结束

相关推荐

如何将POST_ROW_ACTIONS()与自定义操作函数链接

我在下面定义了一个自定义帖子类型,我想添加一个自定义行操作,以允许我通过管理面板“更新”帖子class LeagueCpt { function __construct() { add_action( \'init\', array(&$this,\'registerLeagueCPT\')); add_filter(\'post_row_actions\', array(&$this,\'post_r