In WordPress 2.8, there is a new WP_Widget class, which personally I like it very much as now the multi-instances of widgets is handled by WordPress, all you need to do is just to extends the WP_Widget class and overwrite 3 of the functions namely widgets(), update() and form();
Below is a sample code taken from my WP-Polls that displays Polls Widget. It is tested and it works perfectly. Hope it is useful for plugin authors.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | <?php ### Class: WP-Polls Widget class WP_Widget_Polls extends WP_Widget { // Constructor function WP_Widget_Polls() { $widget_ops = array('description' => __('Put a poll that you have added in WP-Polls on your sidebar', 'wp-polls')); $this->WP_Widget('polls', __('Polls'), $widget_ops); } // Display Widget function widget($args, $instance) { extract($args); $title = esc_attr($instance['title']); $poll_id = intval($instance['poll_id']); $display_pollarchive = intval($instance['display_pollarchive']); echo $before_widget.$before_title.$title.$after_title; get_poll($poll_id); if($display_pollarchive) { display_polls_archive_link(); } echo $after_widget; } // When Widget Control Form Is Posted function update($new_instance, $old_instance) { if (!isset($new_instance['submit'])) { return false; } $instance = $old_instance; $instance['title'] = strip_tags($new_instance['title']); $instance['poll_id'] = intval($new_instance['poll_id']); $instance['display_pollarchive'] = intval($new_instance['display_pollarchive']); return $instance; } // DIsplay Widget Control Form function form($instance) { global $wpdb; $instance = wp_parse_args((array) $instance, array('title' => __('Polls', 'wp-polls'), 'poll_id' => 0, 'display_pollarchive' => 1)); $title = esc_attr($instance['title']); $poll_id = intval($instance['poll_id']); $display_pollarchive = intval($instance['display_pollarchive']); ?> <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:', 'wp-polls'); ?> <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; ?>" /></label> <label for="<?php echo $this->get_field_id('display_pollarchive'); ?>"><?php _e('Display Polls Archive Link Below Poll?', 'wp-polls'); ?> <select name="<?php echo $this->get_field_name('display_pollarchive'); ?>" id="<?php echo $this->get_field_id('display_pollarchive'); ?>" class="widefat"> <option value="0"<?php selected(0, $display_pollarchive); ?>><?php _e('No', 'wp-polls'); ?></option> <option value="1"<?php selected(1, $display_pollarchive); ?>><?php _e('Yes', 'wp-polls'); ?></option> </select> </label> <label for="<?php echo $this->get_field_id('poll_id'); ?>"><?php _e('Poll To Display:', 'wp-polls'); ?> <select name="<?php echo $this->get_field_name('poll_id'); ?>" id="<?php echo $this->get_field_id('poll_id'); ?>" class="widefat"> <option value="-1"<?php selected(-1, $poll_id); ?>><?php _e('Do NOT Display Poll (Disable)', 'wp-polls'); ?></option> <option value="-2"<?php selected(-2, $poll_id); ?>><?php _e('Display Random Poll', 'wp-polls'); ?></option> <option value="0"<?php selected(0, $poll_id); ?>><?php _e('Display Latest Poll', 'wp-polls'); ?></option> </select> </label> <input type="hidden" id="<?php echo $this->get_field_id('submit'); ?>" name="<?php echo $this->get_field_name('submit'); ?>" value="1" /> <?php } } ### Function: Init WP-Polls Widget add_action('widgets_init', 'widget_polls_init'); function widget_polls_init() { register_widget('WP_Widget_Polls'); } ?> |
 



(168 votes, average: 4.03 out of 5)
Lester, can you explain what the new WP_widget class means to us non-developers?
What can the end user expect to see when this class gets implemented?
For non-developers using WP, you can except multi-instances of all widgets even those plugin that has widgets provided that the plugin author has updated the code.
Taking WP-Polls as an example, you can have 10 Polls Widget now instead of the usual 1.
[...] Lester Chan covers the new WP_Widget Class in WordPress 2.8 in greater detail to help Plugin authors understand how it works and how it can help them. [...]
Thanks for the really helpful info. That’s a 5 stars for sure.
[...] Lester Chan – New WP_Widget Class In WordPress 2.8 [...]
[...] Lester Chan covers the new WP_Widget Class for WordPress 2.8. [...]
[...] Lester Chan covers the new WP_Widget Class in WordPress 2.8 in greater detail to help Plugin authors understand how it works and how it can help them. [...]
[...] it) Webdesigner Depot – 7 Interface Design Techniques to Simplify and De-clutter Your Interfaces Lester Chan – New WP_Widget Class In WordPress 2.8 Preparing for WordPress 2.8: Using JavaScript in WordPress Plugins Justin Tadlock – What’s in [...]
Just saw this update on Twitter and seems like wordpress is keeping up its promise by giving the best of feature with every new release.
Thank you. This worked perfectly. =]
[...] you’ll be thrilled to dicover that wp 2.8 will let you create your own widgets and use them in multiple instances on the same page (i.e. WordPress won’t provide an unique id to each widget, but to each widget instance). But [...]
Hi
Thanks for your guide. I have followed your guide and managed to create multiple instances of the plug-in and had then displayed them on different sidebars.
But when I try to change the options on one widget on a sidebar … the changes will automatically apply to all the instances of widgets on all other sidebars!?
Do you have an idea on how to allow the plug-in handle multiple instances of widgets? Or …
Anyway, I have learnt a lot for the first time about Widget once read this guide. Thanks again
Leon
Could you try on my wp-polls2.50 on WP2.8 Beta/RC1, http://downloads.wordpress.org/plugin/wp-polls.zip and see if the same happens as well?
You should change `$title = attr($instance['title']);` into `$title = esc_attr($instance['title']);` on line 13.
This issue could confuse some plugin developer.
Thanks updated. This post is posted before the esc_* function takes place.
[...] Lester Chan – New WP_Widget Class In WordPress 2.8 [...]
Lester,
I’ve zipped the file and uploaded it using the 2.8.1 plugin page on my site. It says it uploaded successfully but I’m getting the error ‘plugin does not have a valid header’ when I try to activate it. Do you know what this is?
Erm this is not a full plugin code, it is just a snippet
[...] 14.New WP_Widget Class In WordPress 2.8 [...]
[...] See the rest here: New WP_Widget Class In WordPress 2.8 « Lester Chan’s WordPress Plugins [...]
Lester — thank you!! I have been all over the Internet and tried many tutorials for adding a WP2.8 widget to my plugin and nothing worked until I found your post. Thank you for sharing your code. It has helped me tremendously!
No problem Jodi! Glad it has help you =)
Lester, thanks! This was just what I was looking for.
LC, I am impressed. Speechless for this tutorial, I’ve been able to convert to this method and it saves time and code and gives us developers and blog users great flexibility. Thanks! Searched the whole Google but didnt find something close to this tutorial. Its straightforward and simple.
Thanks for the kind compliments =)