Wordpress - How to add a specific widget to only 1 page?

It depends on where you want to show the widget.

Let’s start with the widget area (sidebar) registration:

add_action( 'wp_loaded', 'wpse_76959_register_widget_area' );
function wpse_76959_register_widget_area()
{
    register_sidebar(
        array (
            'name'          => __(
                'Widgets on page Sample Page',
                'theme_textdomain'
                ),
            'description'   => __(
                'Will be used on a page with a slug "sample-page" only.',
                'theme_textdomain'
                ),
            'id'            => 'sample-only',
            'before_widget' => '<div id="sample-only-widget">',
            'after_widget'  => '</div>',
            'before_title'  => '<h2>',
            'after_title'   => '</h2>',
        )
    );
}

This is quite simple. We register a new widget area with some custom markup.

enter image description here

Now we have to show it somewhere. We could add a custom action in our page.php template:

do_action( 'show_sample_widget' );

Or we could use an existing action, this would limit the places where the widget is available. For example the action loop_start is called the first time we call the_post() in a loop. If we want to set the widget on top of the page content, we use that hook:

add_action( 'loop_start', 'wpse_76959_render_widget' );

function wpse_76959_render_widget()
{
    is_page( 'sample-page' ) && dynamic_sidebar( 'sample-only' );
    remove_action( current_filter(), __FUNCTION__ );
}

For a custom action we’d use instead:

add_action( 'show_sample_widget', 'wpse_76959_render_widget' );

There are several plugins that allow to show widgets based on specific conditions:

  • Display Widgets: Clean and simple interface
  • Widget Context: It has a few more options than the previous one
  • Dynamic Widgets: This is the most rich of features
  • Widget Logic: This is aimed to programmers as you need to write the condition in PHP code. I.e. is_page('about')

An alternative solution is given by the following plugin, which allows you to define a custom set of widgets on a per-page basis, directly from the edit page screen:

  • WP Page Widget