php – 如何向WP_Widget_Text添加另一个文本框
我是wordpress和小部件的新手.
我正在尝试将另一个字段添加到默认文本小部件.你能帮助我吗? 我想要做的图像: 我能够编辑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); ?> /> <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); ?> /> <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类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |