sidebars_widgets
Позволяет изменить список сайдбаров и виджетов в них.
Использование
add_filter( 'sidebars_widgets', 'wp_kama_sidebars_widgets_filter' ); /** * Function for `sidebars_widgets` filter-hook. * * @param array $sidebars_widgets An associative array of sidebars and their widgets. * * @return array */ function wp_kama_sidebars_widgets_filter( $sidebars_widgets ){ // filter... return $sidebars_widgets; }
- $sidebars_widgets(массив)
Ассоциативный массив с сайдбарами и виджетами в них.
Пример данных, проходящих через хук-фильтр, для темы TownPress:
Array ( [wp_inactive_widgets] => Array ( [0] => lsvr_directory_listing_list-3 [1] => lsvr_townpress_post_list-4 [2] => lsvr_townpress_post_featured-3 [3] => archives-2 [4] => meta-2 [5] => categories-2 [6] => recent-comments-2 ) [lsvr-townpress-default-sidebar-left] => Array ( [0] => search-2 [1] => recent-posts-2 ) [lsvr-townpress-default-sidebar-right] => Array ( [0] => custom_html-2 [1] => cherry_widget_trending_posts-2 ) [lsvr-townpress-footer-widgets] => Array ( [0] => text-2 [1] => tag_cloud-2 ) [lsvr-townpress-custom-sidebar-1] => Array ( ) )
Как видно из примера, первый уровень массива - это список сайдбаров, где ключ массива есть ID сайдбара, указываемый при регистрации функцией register_sidebar(). Во втором уровне массива находятся ID виджетов, прикрепленные к тому или иному сайдбару.
Примеры
#1 Заменим виджеты из одного сайдбара виджетами другого
Пусть у нас есть рубрика Обзоры (taxonomy=category и slug=reviews) с Записями (post_type=post). Мы хотим в обзорах выводить в левом сайдбаре (id=sidebar-left) темы другие виджеты, отличные от тех, что выводятся в этом сайдбаре на всём сайте. Есть несколько решений проблемы, к примеру изменить логику и шаблон вывода сайдбаров темы, но что если не хочется изменять тему? Поможет хук-фильтр sidebars_widgets! Данный код можно использовать как в теме, так и в плагине.
// 1 шаг: Регистрируем новый сайдбар с id=reviews-sidebar add_action( 'widgets_init', 'cr_register_sidebars' ); function cr_register_sidebars() { register_sidebar( array( 'name' => 'Reviews Sidebar', 'id' => 'reviews-sidebar', 'description' => 'Сайдбар для Обзоров', 'class' => '', 'before_widget' => '<div id="%1$s" class="widget %2$s"><div class="widget__inner">', 'after_widget' => '</div></div>', 'before_title' => '<h3 class="widget__title">', 'after_title' => '</h3>', ) ); } // 2 шаг: Заменяем виджеты 'sidebar-left' на виджеты 'reviews-sidebar' add_action( 'wp', 'cr_main_actions' ); function cr_main_actions() { // Проверяем, что текущая Запись относится к рубрике "Обзоры" if ( is_singular( 'post' ) && in_category( 'reviews' ) ) { add_filter( 'sidebars_widgets', 'cr_sidebars_widgets' ); } } // Сама замена виджетов function cr_sidebars_widgets( $sidebars_widgets ) { $sidebars_widgets['sidebar-left'] = $sidebars_widgets['reviews-sidebar']; return $sidebars_widgets; }
Список изменений
С версии 2.7.0 | Введена. |
Где вызывается хук
return apply_filters( 'sidebars_widgets', $sidebars_widgets );
Где используется хук в WordPress
add_filter( 'sidebars_widgets', $filter_callback, 1000 );
remove_filter( 'sidebars_widgets', $filter_callback, 1000 );
add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 );