如何将字段添加到wordpress中的小部件选项?

问题描述:

我写了我的第一个自定义wordpress插件。它基本上是默认Recent Posts插件(即盒子出来的)的副本,然后我添加一个过滤器来仅获得某个特定的帖子类别。最初,我只是硬编码这个,但我想我只是添加一个用户可以更改的小部件选项。这需要在'function form()'中添加一个额外的字段。我基本上只是复制并粘贴“标题”文本框的输入字段(然后为新字段添加适当的代码 - 再次从标题复制和粘贴)。在我做完这些之后,该字段显示得很好,但是当点击保存时,该选项不会保存(该字段每次都会被删除)。基本上,该字段没有正确发布(或沿着这些线)。我的第一个问题是,这些字段存储在哪里?另外,我是否应该在某个地方注册该字段?如何将字段添加到wordpress中的小部件选项?

代码如下... Category字段是我想要添加的。请指教。谢谢。

<?php 
/** 
* Recent_Posts widget class 
* 
* @since 2.8.0 
*/ 
class custom_RecentPostsByCategory extends WP_Widget { 

    function __construct() { 
     $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __("The most recent posts on your site (by Category)")); 
     parent::__construct('recent-posts', __('Custom: Recent Posts'), $widget_ops); 
     $this->alt_option_name = 'widget_recent_entries'; 

     add_action('save_post', array(&$this, 'flush_widget_cache')); 
     add_action('deleted_post', array(&$this, 'flush_widget_cache')); 
     add_action('switch_theme', array(&$this, 'flush_widget_cache')); 
    } 

    function widget($args, $instance) { 
     $cache = wp_cache_get('widget_recent_posts', 'widget'); 

     if (!is_array($cache)) 
      $cache = array(); 

     if (! isset($args['widget_id'])) 
      $args['widget_id'] = $this->id; 

     if (isset($cache[ $args['widget_id'] ])) { 
      echo $cache[ $args['widget_id'] ]; 
      return; 
     } 

     ob_start(); 
     extract($args); 

     $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Posts') : $instance['title'], $instance, $this->id_base); 
     if (empty($instance['number']) || ! $number = absint($instance['number'])) 
      $number = 10; 

     $r = new WP_Query(array('posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true, 'category_name' => $instance['cat'])); 
     if ($r->have_posts()) : 
?> 
     <?php echo $before_widget; ?> 
     <?php if ($title) echo $before_title . $title . $after_title; ?> 
     <ul class="twitter-list"> 
     <?php while ($r->have_posts()) : $r->the_post(); ?> 
      <li class="twitter-item"> 
       <a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if (get_the_title()) the_title(); else the_ID(); ?></a><br/> 
       <?php the_time("F j, Y"); ?> 
      </li> 
     <!--<li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if (get_the_title()) the_title(); else the_ID(); ?></a></li>--> 

     <?php endwhile; ?> 
     </ul> 
     <?php echo $after_widget; ?> 

<?php 
     // Reset the global $the_post as this query will have stomped on it 
     wp_reset_postdata(); 

     endif; 

     $cache[$args['widget_id']] = ob_get_flush(); 
     wp_cache_set('widget_recent_posts', $cache, 'widget'); 
    } 

    function update($new_instance, $old_instance) { 
     $instance = $old_instance; 
     $instance['title'] = strip_tags($new_instance['title']); 
     $instance['cat'] = strip_tags($new_instance['cat']); 
     $instance['number'] = (int) $new_instance['number']; 
     $this->flush_widget_cache(); 

     $alloptions = wp_cache_get('alloptions', 'options'); 
     if (isset($alloptions['widget_recent_entries'])) 
      delete_option('widget_recent_entries'); 

     return $instance; 
    } 

    function flush_widget_cache() { 
     wp_cache_delete('widget_recent_posts', 'widget'); 
    } 

    function form($instance) { 
     $title = isset($instance['title']) ? esc_attr($instance['title']) : ''; 
     $cat = isset($instance['cat']) ? esc_attr($instance['cat']) : ''; 
     $number = isset($instance['number']) ? absint($instance['number']) : 5; 
?> 
     <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 $title; ?>" /></p> 

     <p><label for="<?php echo $this->get_field_id('cat'); ?>"><?php _e('Category:'); ?></label> 
       <input class="widefat" id="<?php echo $this->get_field_id('cat'); ?>" name="<?php echo $this->get_field_name('cat'); ?>" type="text" value="<?php echo $cat; ?>" /></p> 

     <p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to show:'); ?></label> 
     <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p> 
<?php 
    } 
} 

function wpzoom_register_rpa_widget() { 
    register_widget('custom_RecentPostsByCategory'); 
} 
add_action('widgets_init', 'wpzoom_register_rpa_widget'); 
?> 

您必须为小工具使用唯一的id基础。

变化

parent::__construct('recent-posts', __('Custom: Recent Posts'), $widget_ops); 

parent::__construct('recent-posts-custom', __('Custom: Recent Posts'), $widget_ops); 
+0

完美。 – Josh 2011-12-29 06:25:36