Как добавить определенный виджет только на 1 страницу?
Я хотел бы показывать виджет только на одной странице моего сайта. Насколько я понимаю, это невозможно?
Должен ли я добавлять его на все страницы моего сайта или нет?

Это зависит от того, где вы хотите отображать виджет.
Начнем с регистрации области виджетов (сайдбара):
add_action( 'wp_loaded', 'wpse_76959_register_widget_area' );
function wpse_76959_register_widget_area()
{
register_sidebar(
array (
'name' => __(
'Виджеты на странице Пример Страницы',
'theme_textdomain'
),
'description' => __(
'Будет использоваться только на странице с ярлыком "sample-page".',
'theme_textdomain'
),
'id' => 'sample-only',
'before_widget' => '<div id="sample-only-widget">',
'after_widget' => '</div>',
'before_title' => '<h2>',
'after_title' => '</h2>',
)
);
}
Это довольно просто. Мы регистрируем новую область виджетов с пользовательской разметкой.
Теперь нам нужно где-то отобразить её. Мы можем добавить пользовательское действие в наш шаблон page.php
:
do_action( 'show_sample_widget' );
Или мы можем использовать существующее действие, что ограничит места, где виджет будет доступен. Например, действие loop_start
вызывается при первом вызове the_post()
в цикле. Если мы хотим разместить виджет над содержимым страницы, мы используем этот хук:
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__ );
}
Для пользовательского действия мы бы использовали:
add_action( 'show_sample_widget', 'wpse_76959_render_widget' );

Существует несколько плагинов, которые позволяют отображать виджеты на основе определенных условий:
- Display Widgets: Чистый и простой интерфейс
- Widget Context: Имеет немного больше опций по сравнению с предыдущим
- Dynamic Widgets: Наиболее функциональный из всех
- Widget Logic: Предназначен для программистов, так как требует написания условий на PHP-коде. Например:
is_page('about')
Альтернативное решение предлагает следующий плагин, который позволяет определить индивидуальный набор виджетов для каждой страницы прямо из экрана редактирования:

Если вам удобно редактировать файлы шаблонов вашей темы:
Найдите место, где вызывается
dynamic_sidebar('side_bar_name');
и либо до, либо после него, или практически в любом месте вашего сайта используйте:
$pageTitle = get_the_title($post->ID);
$targetPage = 'здесь укажите заголовок страницы, на которую хотите нацелиться';
if($pageTitle == $targetTitle){
the_widget( 'the_widget_unique_id_aka_name', $instance, $args);
}
//the_widget() вызывает конкретный виджет и отображает его
Если хотите сделать это более аккуратно: Создайте функцию в functions.php, которая будет выглядеть так:
function call_my_widget( $post ){
$pageTitle = get_the_title($post->ID);
$targetPage = 'здесь укажите заголовок страницы, на которую хотите нацелиться';
if($pageTitle == $targetTitle){
the_widget( 'the_widget_unique_id_aka_name', $instance, $args);
}
}
Вызовите функцию с помощью:
call_my_widget( $post );
это должно вызываться в цикле или там, где существует глобальная переменная $post
.
Затем вызовите эту функцию в вашем файле шаблона (например, page.php), чтобы отображать целевые виджеты только на целевой странице.

Из документации WP: $instance (array|string) (опционально) Настройки экземпляра виджета. Может быть массивом или строкой в формате запроса. Примеры смотрите в описании каждого виджета. В моем случае это был пустой массив.

Вы можете использовать хук widget_display_callback
: https://developer.wordpress.org/reference/hooks/widget_display_callback/ и просто изменить ID страницы в коде ниже.
// Функция для кастомного отображения виджета
function custom_display_callback( $instance, $widget, $args ){
// Если это страница с ID 10, не отображаем виджет
if( is_page( 10 ) ){
return false;
}
return $instance;
}
// Добавляем фильтр с приоритетом 50 и 3 параметрами
add_filter( 'widget_display_callback', 'custom_display_callback', 50, 3 );
Надеюсь, это поможет. Удачи!
