WordPress Custom Widgets – Mastering Advanced WordPress Development Series

Mastering Advanced WordPress Development Series

WordPress widgets are an essential part of any WordPress site. Widgets provide site owners with a way to add additional content to their website’s sidebars, footer, and other areas. However, WordPress’ default widgets may not be enough for every site’s needs, which is why creating custom widgets can be so beneficial.

In this tutorial, I will walk you through the process of creating a custom widget for your WordPress site. We will begin by discussing what widgets are and how they work. Then, we will create a new custom widget using best practices, and finally, we will discuss how to add the widget to your website’s sidebar.

What are Widgets in WordPress?

Widgets are small pieces of code that can be placed in various areas of your website, such as your sidebar or footer. They are used to display content that doesn’t necessarily fit within your site’s main content area. Examples of widgets include search boxes, calendars, social media links, and more.

Widgets are managed through the WordPress admin panel, where users can add, remove, and reorder widgets as needed. WordPress also comes with several pre-built widgets, such as Categories, Recent Posts, and more.

Creating a Custom Widget

To create a custom widget, you will need to create a new PHP file in your theme or plugin directory. In this file, we will define our custom widget class.

Step 1: Defining the Custom Widget Class

To create a custom widget class, you will need to extend the default WordPress widget class, WP_Widget. This class provides the basic functionality needed for a widget, such as outputting the widget’s HTML.

class Custom_Widget extends WP_Widget {
   // Constructor function
   function __construct() {
         'custom_widget', // Widget ID
         esc_html__( 'Custom Widget', 'text_domain' ), // Widget name
         array( 'description' => esc_html__( 'A custom widget', 'text_domain' ), ) // Widget description
   // Widget front-end
   public function widget( $args, $instance ) {
      // Widget output
   // Widget back-end
   public function form( $instance ) {
      // Widget form
   // Updating widget
   public function update( $new_instance, $old_instance ) {
      // Save widget options

In the code above, we have defined a new widget class called Custom_Widget. This class extends the WP_Widget class and overrides several of its methods.

The constructor function is called when the widget is first created. It defines the widget’s ID, name, and description.

The widget() function is called when the widget is displayed on the front-end of your site. This is where you will output the HTML for your widget.

The form() function is called when the widget is edited in the WordPress admin panel. This is where you will define the widget’s options and create the widget form.

Finally, the update() function is called when the widget’s options are updated. This is where you will save the widget options to the database.

Step 2: Creating the Widget HTML

Now that we have defined our custom widget class, we can begin creating the widget’s HTML. To do this, we will add code to the widget() function.

// Widget front-end
public function widget( $args, $instance ) {
   echo $args['before_widget'];
   if ( ! empty( $instance['title'] ) ) {
      echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
   // Widget content
   echo '<p>Hello World!</p>';
   echo $args['after_widget'];

In the code above, we have added a basic HTML output for our widget. The before_widget, before_title, after_title, and after_widget variables are provided by WordPress and will output the appropriate HTML markup for your widget.

The widget() function is passed two arguments: $args and $instance. The $args variable contains information about the widget’s position on the page, while the $instance variable contains the widget’s options, such as the widget title.

In this example, we are outputting the widget title (if it exists) and a simple “Hello World!” message.

Step 3: Creating the Widget Form

Now that we have defined the widget’s front-end HTML, we can create the widget form. To do this, we will add code to the form() function.

// Widget back-end
public function form( $instance ) {
$title = ! empty( $instance['title'] ) ? $instance['title'] : esc_html__( 'New title', 'text_domain' );

   <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_attr_e( 'Title:', 'text_domain' ); ?></label> 
   <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">

In the code above, we are creating a simple form with a single input field for the widget’s title. We are using the get_field_id() and get_field_name() functions to generate unique IDs and names for the input field.

The $instance variable contains the current widget options, which we can use to pre-populate the input field with the current title (if it exists). We are also using the esc_html__() and esc_attr_e() functions to sanitize the input and output.

Step 4: Saving the Widget Options

Finally, we need to save the widget options to the database. To do this, we will add code to the update() function.

// Updating widget
public function update( $new_instance, $old_instance ) {
   $instance = array();
   $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? sanitize_text_field( $new_instance['title'] ) : '';
   return $instance;

In the code above, we are creating a new $instance array and populating it with the updated widget options. We are also using the sanitize_text_field() function to sanitize the input.

Step 5: Adding the Widget to Your Site

Now that we have created our custom widget, we need to add it to our website’s sidebar. To do this, go to Appearance > Widgets in the WordPress admin panel. You should see your new custom widget listed among the available widgets.

Drag your custom widget to the desired widget area, and then configure its options as desired. When you’re finished, click the “Save” button to save your changes.


In conclusion, creating custom widgets in WordPress is an essential skill for developers who want to add custom functionality to their WordPress sites. In this tutorial, we have covered the basics of creating a custom widget, including defining the custom widget class, creating the widget’s HTML output and form, and saving the widget’s options to the database. We have also discussed how to add the widget to your website’s sidebar.

Custom widgets can be used to add a wide range of functionality to your WordPress site, such as social media feeds, contact forms, and custom navigation menus. They can also be customized to fit your site’s design and branding, making them a powerful tool for site owners and developers alike.

When creating custom widgets, it’s important to follow best practices and WordPress coding standards to ensure your code is secure, maintainable, and compatible with other plugins and themes. This includes using proper documentation and comments, sanitizing user input, and testing your code thoroughly.

By following the steps outlined in this tutorial, you should now have a basic understanding of how to create custom widgets in WordPress. With this knowledge, you can start experimenting with different types of widgets and creating custom functionality for your WordPress sites.

Stay in the loop with our web development newsletter - no spam, just juicy updates! Join us now. Join our web development newsletter to stay updated on the latest industry news, trends, and tips. No spam, just juicy updates delivered straight to your inbox. Don't miss out - sign up now!

We’ve tried our best to explain everything thoroughly, even though there’s so much information out there. If you found our writing helpful, we’d really appreciate it if you could buy us a coffee as a token of support.

Also, if you’re interested in learning more about WordPress, Javascript, HTML, CSS, and programming in general, you can subscribe to our MailChimp for some extra insights.


This site uses Akismet to reduce spam. Learn how your comment data is processed.