微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 如何向WP_Widget_Text添加另一个文本框

我是wordpress和小部件的新手.

我正在尝试将另一个字段添加认文本小部件.你能帮助我吗?

我想要做的图像:
http://imgur.com/KoYvV

我能够编辑default-widgets.PHP添加一个textarea但它无法正常工作.请帮助并引导我找到正确的方向.

class WP_Widget_Text 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 widget( $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 );
        $text = apply_filters( 'widget_text2',empty( $instance['text2'] ) ? '' : $instance['text2'],$instance );
        echo $before_widget;
        if ( !empty( $title ) ) { echo $before_title . $title . $after_title; } ?>
            <div class="textwidget">
                <?PHP echo !empty( $instance['filter'] ) ? wpautop( $text ) : $text; ?>
            </div>
            <div class="textwidget2">
                <?PHP echo !empty( $instance['filter'] ) ? wpautop( $text2 ) : $text2; ?>
            </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'];
            $instance['text2'] =  $new_instance['text2'];
        } else {
            $instance['text'] = stripslashes( wp_filter_post_kses( addslashes($new_instance['text']) ) ); // wp_filter_post_kses() expects slashed
            $instance['text2'] = stripslashes( wp_filter_post_kses( addslashes($new_instance['text2']) ) ); // 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' => '','text2' => '' ) );
        $title = strip_tags($instance['title']);
        $text = esc_textarea($instance['text']);
        $text2 = esc_textarea($instance['text2']);
?>
        <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>
        <textarea class="widefat" rows="8" cols="20" id="<?PHP echo $this->get_field_id('text2'); ?>" name="<?PHP echo $this->get_field_name('text2'); ?>"><?PHP echo $text2; ?></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
    }
}

解决方法

我不确定你是否已经想出来了,但这里是你问题的解决方案.

首先,您不希望直接编辑窗口小部件.如果您更新wordpress,您的代码将被覆盖. wordpress具有高度可扩展性,因此您无需直接编辑代码.

理想情况下,您应该创建一个插件.如果你想学习如何,请阅读这篇http://codex.wordpress.org/Writing_a_Plugin

wordpress的另一个好处是它们有非常好的文档.

但是,为简单起见,我们将在您正在使用的主题中的functions.PHP中执行此操作.您可以在/wp-content/themes/your_theme/functions.PHP中找到它

以下是您问题中代码示例的修改版本:

//First we need to change the name of the Widget. I just named it RT_Widget_Text,so just be aware that you can change it to anything you want and to replace all instances of that text. Just make sure to not name it WP_Widget_Text
class RT_Widget_Text extends WP_Widget {

    function __construct() {
        //I made a change here. I changed the class name to widget_double_text. This probably has no effect,but I just changed it for good measure.
        $widget_ops = array('classname' => 'widget_double_text','height' => 350);

        //Here is the important part. Change the "text" to "double_text" and "Text" to "Text 2" or to some other text that will identify the widget.
        parent::__construct('double_text',__('Text 2'),$instance );
        //I changed this to $text2 = instead of $text =
        //This would have caused the first text section to display you text2 and your text2 to display nothing.
        //I wonder if this was your issue?
        $text2 = apply_filters( 'widget_text','text2' => '' ) );
        $title = strip_tags($instance['title']);
        $text = esc_textarea($instance['text']);
        $text2 = esc_textarea($instance['text2']);
?>
        <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>
        <textarea class="widefat" rows="8" cols="20" id="<?PHP echo $this->get_field_id('text2'); ?>" name="<?PHP echo $this->get_field_name('text2'); ?>"><?PHP echo $text2; ?></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
    }
}
//Now you need to register your widget. Remember to change it to whatever you named your widget
add_action( 'widgets_init',create_function( '','register_widget( "RT_Widget_Text" );' ) );

尽管如此,我认为你的bug可能是你的widget($args,instance)方法中的一个简单的错误

$text = apply_filters( 'widget_text',$instance );
$text = apply_filters( 'widget_text2',$instance );

请注意,您在此处设置$text =两次.所以你基本上覆盖了文本的值,并用text2替换它.然后,将text2 null留空.

如果这不是你的问题,那么它可能与将窗口小部件注册为“文本”有关,因为它是由WP_Widget_Text占用的.这不太可能,因为我假设你直接编辑了WP_Widget_Text类.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐