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.
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