加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:44:13 所属栏目:PHP教程 来源:网络整理
导读:我是wordpress和小部件的新手. 我正在尝试将另一个字段添加到默认文本小部件.你能帮助我吗? 我想要做的图像: http://imgur.com/KoYvV 我能够编辑default-widgets.php并添加另一个textarea但它无法正常工作.请帮助并引导我找到正确的方向. class WP_Widget_
我是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类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读