简体   繁体   English

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

[英]How to add another text box to WP_Widget_Text

I am new to wordpress and widgets. 我是wordpress和小部件的新手。

I am trying to add another field to the default text widget. 我正在尝试将另一个字段添加到默认文本小部件。 Can you guys help me out. 你能帮助我吗?

An image of what i am trying to do: http://imgur.com/KoYvV 我想要做的图像: http//imgur.com/KoYvV

I was able to edit default-widgets.php and add another textarea but it does not work properly. 我能够编辑default-widgets.php并添加另一个textarea但它无法正常工作。 please help and guide me to the right direction. 请帮助并引导我找到正确的方向。

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
    }
}

I'm not sure if you figured out yet, but here is a solution to your problem. 我不确定你是否已经想出来了,但这里是你问题的解决方案。

The first thing is you don't want to edit the widget directly. 首先,您不希望直接编辑窗口小部件。 If you update Wordpress, your code will be overwritten. 如果您更新Wordpress,您的代码将被覆盖。 Wordpress is highly extensible, so you never have to edit the code directly. Wordpress具有高度可扩展性,因此您无需直接编辑代码。

Ideally, you should create a plugin. 理想情况下,您应该创建一个插件。 If you want to learn how, read this http://codex.wordpress.org/Writing_a_Plugin 如果你想学习如何,请阅读http://codex.wordpress.org/Writing_a_Plugin

Another great thing about Wordpress is that they have very good documentation. Wordpress的另一个好处是它们有非常好的文档。

However, for simplicity we will just do this in functions.php in the theme you are using. 但是,为简单起见,我们将在您正在使用的主题中的functions.php中执行此操作。 You can find it in /wp-content/themes/your_theme/functions.php 您可以在/wp-content/themes/your_theme/functions.php找到它

Here is the modified version of the code sample in your question: 以下是您问题中代码示例的修改版本:

//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', 'description' => __('Arbitrary text or HTML'));
        $control_ops = array('width' => 400, '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'), $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 );
        //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', 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
    }
}
//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" );' ) );

With all that said, I think your bug may have been a simple typo in your widget( $args, instance) method here: 尽管如此,我认为你的bug可能是你的widget( $args, instance)方法中的一个简单的错误:

$text = apply_filters( 'widget_text', empty( $instance['text'] ) ? '' : $instance['text'], $instance );
$text = apply_filters( 'widget_text2', empty( $instance['text2'] ) ? '' : $instance['text2'], $instance );

Notice that you are setting $text = twice here. 请注意,您在此处设置$text =两次。 So you basically overwrote the value of text and replaced it with text2. 所以你基本上覆盖了文本的值,并用text2替换它。 And then that left text2 null. 然后,将text2 null留空。

If that was not your problem, then it may have to do with registering the widget as "text" since that is taken by WP_Widget_Text. 如果这不是你的问题,那么它可能与将窗口小部件注册为“文本”有关,因为它是由WP_Widget_Text占用的。 This is unlikely since I'm assuming you edited the WP_Widget_Text class directly. 这不太可能,因为我假设你直接编辑了WP_Widget_Text类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM