unregister a sidebar widget

时间:2011-02-23 作者:Mild Fuzz

法典说它被贬值了。作为一个长期使用插件的用户,我知道当插件不清理自己的时候有多烦人,这是不是有必要的弃用迹象?

1 个回复
最合适的回答,由SO网友:t31os 整理而成

如果删除了添加小部件或边栏的主题或插件,那么基本上它是从系统中删除的,停用/删除时没有清除的是存储在选项表中的小部件数据(适用于小部件,而不是边栏)。

如果删除了一个侧栏,我相信之前在侧栏中的任何小部件都会被移动到非活动的小部件组中,但是我看不到WP会进行任何清理以从选项表中删除小部件数据(如果您好奇的话,每个小部件在表中有一行)。

我做了一个快速测试,注释了所有注册的侧栏,验证了我无法添加小部件,我在小部件页面上看到了这一点。

未定义侧栏

您当前使用的主题不支持小部件,这意味着它没有您可以更改的侧栏。有关使主题小部件感知的信息,请按照以下说明操作。

然后我启动PhpMyAdmin并检查选项表,仍然可以看到各种小部件条目,例如。widget_categories, widget_text 以及其他各种类型。

因此,我的印象是,您唯一需要清理的是安装中可能不再存在的小部件中的小部件数据,即即使小部件不再注册,数据也将保留在选项表中(我还测试了注销/删除我拥有的自定义小部件,数据仍然保留)。

选项数据根据注册小部件的类名(这在$widget_op 给定小部件类的构造函数内的变量设置)。这些键基本上只是加上前缀widget_ 然后是类名,例如,文本小部件在选项表中有以下键-widget_widget_text.

Correction: 该键派生自widget类注册代码的这一部分,但前缀为widget_ (例如。widget_somename).

$this->WP_Widget(\'somename\', __(\'Some Name\'), $widget_ops, $control_ops);
当然,您不太可能知道从系统中删除的小部件的名称,我只是想知道如何准确地确定小部件的选项键名称。

希望这有帮助。

EDIT:
根据我对这个答案的评论,我编写了一个函数来输出选项表中可能冗余的小部件条目列表。

add_action( \'load-widgets.php\', \'check_for_widget_data\' );
function check_for_widget_data() {
    add_action( \'admin_notices\', \'notify_of_redundant_widgets\' );
}
function notify_of_redundant_widgets() {
    global $wp_registered_widgets, $wpdb;
    $names= array();
    foreach( $wp_registered_widgets as $instance_key => $data )
        $names[] = $data[\'callback\'][0]->option_name;

    $names = array_unique($names);

    $stored = $wpdb->get_col("SELECT option_name FROM $wpdb->options WHERE option_name LIKE \'widget_%\'");

    sort($names);
    sort($stored);
    $diff = array_diff( $stored, $names );
    if( empty( $diff ) )
        return;

    echo \'<div class="updated"><p><strong>Looks like there\\\'s some left over widget data in the options table.</strong><br />The following rows may now be redundant.<br />\';
    echo \'<ul><li>&bull; \'. implode( \'</li><li>&bull; \', $diff ) . \'</li>\';
    echo \'</p></div>\';
}
以防对某人有用。。

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?