Backward compatibility for WordPress widget settings

I came across this issue when I had to change a single widget checkbox to a dropdown with multiple options.

One of my plugins has a widget with a checkbox where you can select to display scheduled posts with future dates only.

I wanted to change it to a dropdown where you can also choose posts from the current month, current year etc.

To do this I had to add backward compatibility for the old checkbox setting.

Meaning, if the plugin is updated and the scheduled posts checkbox was selected for a widget, the “posts with future dates only” dropdown option should be selected automatically after the update.

Take a look at this basic widget class with a checkbox.

As you can see there is a checkbox status_future setting in this widget that is needed in all three methods: widget(), update() and form().

In the the updated widget class with a dropdown I’ve replaced the checkbox with a dropdown (with the setting name include_posts), and added a new get_instance_settings() method to apply the backward compatibility to the widget settings.

As you can see, the new method checks if the status_future setting exists and the include_posts setting doesn’t. If that’s the case it creates the new (dropdown) include_posts setting with the old (checkbox) status_future setting value.

This method is called at the top of the widget() and form() methods to apply the backward compatibility before using the widget settings. In the update() method the old status_future setting is removed before updating because it’s not needed anymore.

And that’s how I applied backward compatibility for the settings of my widget. Let me know in the comments if you have any questions or if you ever had to deal with similar issues.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s