如何重载现有窗口小部件的更新()?

时间:2011-09-13 作者:Lilian

问题:我无法重载现有小部件的update()方法。小部件方法和表单方法工作正常,但我无法更新表单方法中定义的新选项的值。

我是如何做到这一点的:

我想使用自定义主题中的默认WP小部件,我需要给它们我公司的外观和感觉。

我继承了WP\\u Widget\\u Pages类并重载了form()(我需要添加两个选项)、update(来管理新选项)和Widget()方法。

在我的功能中。php它如下所示:

function load_my_widgets() {
register_widget(\'WP_MY_Widget_Pages\');
}

/* Add our function to the widgets_init hook. */
add_action( \'widgets_init\', \'load_my_widgets\' );

class WP_MY_Widget_Pages extends WP_Widget_Pages {

function widget( $args, $instance ) {
    parent::widget($args, $instance)
}

function update( $new_instance, $old_instance ) {
    $first_instance = parent::update($new_instance, $old_instance);
    $first_instance[\'block_type\'] = \'my_block_type\';
    $first_instance[\'block_color\'] = \'my_block_color\';

    return $first_instance;
}

function form( $instance ) {
    //Defaults
    $instance = wp_parse_args( (array) $instance, array( \'sortby\' => \'post_title\', \'title\' => \'\', \'exclude\' => \'\', \'block_type\' => \'\', \'block_color\' => \'\' ));
    $block_type = esc_attr( $instance[\'block_type\'] );
    $block_color = esc_attr( $instance[\'block_color\'] );
    parent::form($instance);
    ?>
        <p>
            <label for="<?php echo $this->get_field_id(\'block_type\'); ?>"><?php _e( \'Block type:\' ); ?></label>
            <select name="<?php echo $this->get_field_name(\'block_type\'); ?>" id="<?php echo $this->get_field_id(\'block_type\'); ?>" class="widefat">
                <?php foreach (get_all_block_type() as $block_label => $block_type): ?>
                    <option <?php selected( $block_type , $instance[\'block_type\'] ); ?> value="<?php echo $block_type; ?>"><?php _e($block_label); ?></option>
                <?php endforeach; ?>
            </select>
            <?php echo \'Block type : \'.$instance[\'block_type\']; ?>
        </p>
        <p>
            <label for="<?php echo $this->get_field_id(\'block_color\'); ?>"><?php _e( \'Block color:\' ); ?></label>
            <select name="<?php echo $this->get_field_name(\'block_color\'); ?>" 
                    id="<?php echo $this->get_field_id(\'block_color\'); ?>" 
                    class="widefat" style="background-color: <?php echo $block_color_value; ?>" >
                <?php foreach (get_all_block_color() as $block_color_label => $block_color_class): ?>
                    <option <?php selected( $block_color_label , $instance[\'block_color\'] ); ?> value="<?php echo $block_color_label;?>" style="background-color: <?php echo $block_color_class;?>" >&nbsp;</option>
                <?php endforeach; ?>
            </select>
            <?php echo \'block color : \'.$instance[\'block_color\']; ?>
        </p>

    <?php
}

}
为了便于阅读,我已经清理了widget方法。我没有在update()中进行验证,我已经设置了一个文本值使其简短。

当我转到仪表板/小部件页面,然后显示我的页面小部件时,我可以为这两个新属性设置值。保存时,新选项值的输出不显示任何内容(数据库中也没有任何内容:从wp\\u options中选择option\\u value,其中option\\u id=\'106’;)

如果有任何提示,我将不胜感激。

提前谢谢。

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

我的同事不久前也遇到了类似的问题。他从来没有找到WordPress的bug,但是unregister_widget( \'Widget_Class_Being_Extended\' ) 成功了。

结束

相关推荐

Why use widgets?

我对使用WordPress很陌生,我想知道使用小部件的好处是什么?看here 这听起来像是为那些不是程序员的人准备的,他们想在他们的网站上添加插件。对吗?或者小部件是否在某种程度上使站点更加健壮?