覆盖函数WordPress中的小部件

时间:2013-06-12 作者:JohnSmith

我试图覆盖WordPress中的文本小部件。我的代码如下所示:

class WP_Widget_Text_Custom extends WP_Widget {

    function __construct() {
        $widget_ops = array(\'classname\' => \'widget_text\', \'description\' => __(\'Arbitrary text or HTML\'));
        $control_ops = array(\'width\' => 400, \'height\' => 350);
        parent::__construct(\'text\', __(\'Text\'), $widget_ops, $control_ops);
    }

    function WP_Widget_Calendar( $args, $instance ) {
        extract($args);
        $title = apply_filters( \'widget_title\', empty( $instance[\'title\'] ) ? \'\' : $instance[\'title\'], $instance, $this->id_base );
        $text = apply_filters( \'widget_text\', empty( $instance[\'text\'] ) ? \'\' : $instance[\'text\'], $instance );
        echo $before_widget;
        if ( !empty( $title ) ) { echo $before_title . $title . $after_title; } ?>
            <div class="textwidget test"><?php echo !empty( $instance[\'filter\'] ) ? wpautop( $text ) : $text; ?></div>
        <?php
        echo $after_widget;
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance[\'title\'] = strip_tags($new_instance[\'title\']);
        if ( current_user_can(\'unfiltered_html\') )
            $instance[\'text\'] =  $new_instance[\'text\'];
        else
            $instance[\'text\'] = stripslashes( wp_filter_post_kses( addslashes($new_instance[\'text\']) ) ); // wp_filter_post_kses() expects slashed
        $instance[\'filter\'] = isset($new_instance[\'filter\']);
        return $instance;
    }

    function form( $instance ) {
        $instance = wp_parse_args( (array) $instance, array( \'title\' => \'\', \'text\' => \'\' ) );
        $title = strip_tags($instance[\'title\']);
        $text = esc_textarea($instance[\'text\']);
?>
        <p><label for="<?php echo $this->get_field_id(\'title\'); ?>"><?php _e(\'Title:\'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id(\'title\'); ?>" name="<?php echo $this->get_field_name(\'title\'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>

        <textarea class="widefat" rows="16" cols="20" id="<?php echo $this->get_field_id(\'text\'); ?>" name="<?php echo $this->get_field_name(\'text\'); ?>"><?php echo $text; ?></textarea>

        <p><input id="<?php echo $this->get_field_id(\'filter\'); ?>" name="<?php echo $this->get_field_name(\'filter\'); ?>" type="checkbox" <?php checked(isset($instance[\'filter\']) ? $instance[\'filter\'] : 0); ?> />&nbsp;<label for="<?php echo $this->get_field_id(\'filter\'); ?>"><?php _e(\'Automatically add paragraphs\'); ?></label></p>
<?php
    }
}

function custom_register_widgets() {
    register_widget( \'WP_Widget_Text_Custom\' );
}

add_action( \'widgets_init\', \'custom_register_widgets\' );
我收到以下错误消息:

*函数WP\\u Widget::Widget()必须在子类中覆盖*

我复制了WP_Widget_Text 从…起default-widgets.phpfunctions.php 并添加_Custom 在类名中。

为什么会出现此错误,如何修复?

1 个回复
SO网友:Bainternet

您之所以出现此错误,是因为您的类没有名为widget的方法,这是正确使用widgets api. 这意味着扩展WP_Widget 类必须具有名为widget 它负责实际的小部件显示。因此,将此结构视为小部件类框架:

class custom_Widget extends WP_Widget {
    public function __construct() {}// widget actual processes
    public function widget( $args, $instance ) {} // outputs the content of the widget
    public function form( $instance ) {} // outputs the options form on admin
    public function update( $new_instance, $old_instance ) {} // processes widget options to be saved
}
在您的情况下,除了widget方法之外,您还可以回答第二个问题(如何修复?)只需重新命名您的WP_Widget_Calendar 方法到widget.

结束

相关推荐

Prevent widgets removal

我正在用许多小部件构建一个网站。它们是高度定制的。当站点处于活动状态时,几个管理员/编辑器必须编辑这些小部件。现在,我很害怕看到一个小部件(及其配置)可以在一次鼠标移动中完全擦除(将其从侧栏中删除)。有没有什么方法可以防止小部件被删除,同时保持编辑其内容的能力?此外,在我看来,管理中的widget管理页面为“添加widget”模块提供了太多的空间,而为“激活的widget”模块提供的空间不足。这在创建站点时很有用,但在完成站点时却毫无用处。有没有办法切换这些模块的大小?非常感谢