Хук sidebars_widgets
позволяет изменять содержимое сайдбаров и управлять виджетами, которые в них отображаются. С его помощью можно динамически включать или отключать виджеты в зависимости от условий, например, страницы или типа записи.
Фильтр sidebars_widgets
предоставляет разработчикам возможность модифицировать массив виджетов и сайдбаров перед тем, как они будут выведены на странице.
apply_filters( 'sidebars_widgets', array $sidebars_widgets )
$sidebars_widgets
(array) — Ассоциативный массив, где ключи — это ID сайдбаров, а значения — массивы виджетов, прикрепленных к каждому сайдбару.
Пример данных, проходящих через хук:
Array
(
[wp_inactive_widgets] => Array
(
[0] => search-2
[1] => recent-posts-2
[2] => text-2
)
[primary-sidebar] => Array
(
[0] => categories-1
[1] => archives-1
)
[footer-sidebar] => Array
(
[0] => recent-comments-1
)
)
Использование
Для применения фильтра sidebars_widgets
добавьте функцию через add_filter()
, которая изменит содержимое сайдбаров в зависимости от поставленных условий.
Пример #1: Скрытие виджета на определенной странице
Допустим, нужно скрыть виджет «Обо мне» в сайдбаре primary-sidebar
на страницах «О нас» и «Главная».
add_filter( 'sidebars_widgets', 'hide_about_widget_on_pages' );
function hide_about_widget_on_pages( $sidebars_widgets ) {
if ( is_admin() ) {
return $sidebars_widgets;
}
if ( is_page( 'about' ) || is_front_page() ) {
$widget_key = array_search( 'about_me_widget', $sidebars_widgets['primary-sidebar'] );
if ( false !== $widget_key ) {
unset( $sidebars_widgets['primary-sidebar'][ $widget_key ] );
}
}
return $sidebars_widgets;
}
Этот код удаляет виджет с ID about_me_widget
из primary-sidebar
на страницах «О нас» и «Главная».
Пример #2: Замена виджетов сайдбара на странице определенной категории
Предположим, на сайте есть категория «Новости», и нужно заменить стандартные виджеты в sidebar-right
на специальные виджеты, которые показываются только в этой категории.
// Регистрация отдельного сайдбара для категории "Новости"
add_action( 'widgets_init', 'register_news_sidebar' );
function register_news_sidebar() {
register_sidebar( array(
'name' => 'News Sidebar',
'id' => 'news-sidebar',
'description' => 'Сайдбар для категории Новости',
'before_widget' => '<div class="widget news-widget">',
'after_widget' => '</div>',
'before_title' => '<h3>',
'after_title' => '</h3>',
) );
}
// Замена виджетов в сайдбаре
add_filter( 'sidebars_widgets', 'replace_sidebar_for_news_category' );
function replace_sidebar_for_news_category( $sidebars_widgets ) {
if ( is_category( 'news' ) ) {
$sidebars_widgets['sidebar-right'] = $sidebars_widgets['news-sidebar'];
}
return $sidebars_widgets;
}
Этот код заменяет виджеты в sidebar-right
на виджеты из news-sidebar
, если пользователь просматривает страницу категории «Новости».
Пример #3: Скрытие всех виджетов для неавторизованных пользователей
Если требуется отключить отображение всех виджетов для гостей (неавторизованных пользователей), можно воспользоваться следующим кодом:
add_filter( 'sidebars_widgets', 'hide_widgets_for_guests' );
function hide_widgets_for_guests( $sidebars_widgets ) {
if ( ! is_user_logged_in() ) {
foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
$sidebars_widgets[ $sidebar_id ] = array();
}
}
return $sidebars_widgets;
}
Код проверяет, авторизован ли пользователь, и если нет, очищает все сайдбары, убирая из них виджеты.
Пример #4: Переопределение виджетов для определенного типа записи
Если требуется изменить содержимое сайдбара для конкретного типа записи, можно воспользоваться следующим примером. Здесь виджеты в sidebar-custom
будут заменены на виджеты sidebar-portfolio
для записей типа portfolio
.
add_filter( 'sidebars_widgets', 'custom_sidebar_for_portfolio' );
function custom_sidebar_for_portfolio( $sidebars_widgets ) {
if ( is_singular( 'portfolio' ) ) {
$sidebars_widgets['sidebar-custom'] = $sidebars_widgets['sidebar-portfolio'];
}
return $sidebars_widgets;
}
Этот код проверяет, отображается ли запись типа portfolio
, и заменяет стандартные виджеты в sidebar-custom
на виджеты sidebar-portfolio
.
Пример #5: Изменение порядка виджетов в сайдбаре
В некоторых случаях может понадобиться изменить порядок виджетов в сайдбаре. В следующем примере мы меняем порядок виджетов в primary-sidebar
, перемещая виджет search
на первое место.
add_filter( 'sidebars_widgets', 'reorder_widgets_in_primary_sidebar' );
function reorder_widgets_in_primary_sidebar( $sidebars_widgets ) {
if ( isset( $sidebars_widgets['primary-sidebar'] ) ) {
$primary_sidebar_widgets = $sidebars_widgets['primary-sidebar'];
// Перемещаем виджет с ID `search-2` на первое место
$search_key = array_search( 'search-2', $primary_sidebar_widgets );
if ( false !== $search_key ) {
unset( $primary_sidebar_widgets[ $search_key ] );
array_unshift( $primary_sidebar_widgets, 'search-2' );
}
$sidebars_widgets['primary-sidebar'] = $primary_sidebar_widgets;
}
return $sidebars_widgets;
}
Этот код перемещает виджет с ID search-2
на первую позицию в primary-sidebar
.
Заключение
Хук sidebars_widgets
предоставляет гибкие возможности для управления виджетами в сайдбарах WordPress. С его помощью можно изменять виджеты в зависимости от страницы, типа записи, категории, роли пользователя и других условий, что позволяет тонко настраивать интерфейс сайта под разные сценарии использования.