Intereting Posts
Список всех сообщений в категории с функцией query_post () Правила перезаписи URL для запроса нескольких таксономий Добавить другой тип ссылки в WordPress Admin Appearance -> Интерфейс меню Не удалось выполнить функцию сохранения мета-окна и дезинфекцию / проверку wp_insert_term не работает с налогом пользовательского типа Нет файла wp-config.php при локальной установке wordpress-сайта по-прежнему отображается Как разрешить определенной роли, такой как Contributor, иметь возможность просматривать только ожидающие комментарии и одобрять их? Сортировка по пользовательскому значению поля Ошибка: предупреждение: strpos () в media.php Регистрация домена в WordPress Можно ли настроить многопользовательскую систему в Woocommerce? Как перезаписывается URL-адрес W3 Total Cache CDN? ПОЕДИТ – Продолжить перевод Как исправить причину конфликта по моей теме с помощью Woocommerce и / или Gravity Forms? Получить значения дополнительных пользовательских полей перед сохранением

Вызовите dynamic_sidebar, но включите / исключите именованные виджеты?

Можно ли включать или исключать определенные именованные виджеты, которые назначены вызову named dynamic_sidebar?

Например, если я зарегистрировал боковую панель с именем «my_sidebar», и пользователь разместил в ней виджет «Ссылки», я хочу включить или исключить его на основе пользовательской настройки на панели параметров темы.

Это возможно?

Любое понимание очень ценится.

Solutions Collecting From Web of "Вызовите dynamic_sidebar, но включите / исключите именованные виджеты?"

dynamic_sidebar() вызывает wp_get_sidebars_widgets() чтобы получить все виджеты на боковой панели. Я думаю, что фильтрация этого результата – лучший способ удалить виджет из боковой панели.

 add_filter( 'sidebars_widgets', 'wpse17681_sidebars_widgets' ); function wpse17681_sidebars_widgets( $sidebars_widgets ) { if ( is_page() /* Or whatever */ ) { foreach ( $sidebars_widgets as $sidebar_id => &$widgets ) { if ( 'my_sidebar' != $sidebar_id ) { continue; } foreach ( $widgets as $idx => $widget_id ) { // There might be a better way to check the widget name if ( 0 === strncmp( $widget_id, 'links-', 6 ) ) { unset( $widgets[$idx] ); } } } } return $sidebars_widgets; } 

Я добавляю еще один ответ, чтобы ответить на этот вопрос: – Как исключить отображение определенного виджета на домашней / главной странице?

У WordPress есть внутренняя функция _get_widget_id_base() Я не уверен, насколько безопасно ее использовать. Но это метод, который WordPress использует для получения базы идентификатора виджета, используя идентификатор виджетов вместо strpos() и strncmp() .

Пример:-

 add_filter('sidebars_widgets', 'conditional_sidebar_widget'); /** * Filter the widget to display * @param array $widets Array of widget IDs * @return array $widets Array of widget IDs */ function conditional_sidebar_widget($widets) { $sidebar_id = 'sidebar-1'; //Sidebar ID in which widget is set if ( (is_home() || is_front_page()) && !empty($widets[$sidebar_id]) && is_array($widets[$sidebar_id]) ) { foreach ($widets[$sidebar_id] as $key => $widget_id) { $base_id = _get_widget_id_base($widget_id); if ($base_id == 'recent-posts') { unset($widets[$sidebar_id][$key]); } } } return $widets; } не add_filter('sidebars_widgets', 'conditional_sidebar_widget'); /** * Filter the widget to display * @param array $widets Array of widget IDs * @return array $widets Array of widget IDs */ function conditional_sidebar_widget($widets) { $sidebar_id = 'sidebar-1'; //Sidebar ID in which widget is set if ( (is_home() || is_front_page()) && !empty($widets[$sidebar_id]) && is_array($widets[$sidebar_id]) ) { foreach ($widets[$sidebar_id] as $key => $widget_id) { $base_id = _get_widget_id_base($widget_id); if ($base_id == 'recent-posts') { unset($widets[$sidebar_id][$key]); } } } return $widets; } 

Расширяя ответ Яна, я нашел strpos() вместо strncmp() для проверки имени виджета (это быстрее ..)

После этого вы найдете аналогичную функцию (работа и тестирование), которая приведет вас к одному и тому же результату:

  add_filter( 'sidebars_widgets', 'hide_widgets' ); function hide_widgets( $excluded_widgets ) { if ( is_page() /* Or whatever */ ) { //set the id in 'sidebar-id' to your needs foreach ( $excluded_widgets['sidebar-id'] as $i => $inst) { //in this example we'll check if the id for the rss widgets exists.(change it to suit your needs) $pos = strpos($inst, 'rss'); if($pos !== false) { //unsetting the id will remove the widget unset($excluded_widgets['sidebar-id'][$i]); } } } return $sidebars_widgets; } не  add_filter( 'sidebars_widgets', 'hide_widgets' ); function hide_widgets( $excluded_widgets ) { if ( is_page() /* Or whatever */ ) { //set the id in 'sidebar-id' to your needs foreach ( $excluded_widgets['sidebar-id'] as $i => $inst) { //in this example we'll check if the id for the rss widgets exists.(change it to suit your needs) $pos = strpos($inst, 'rss'); if($pos !== false) { //unsetting the id will remove the widget unset($excluded_widgets['sidebar-id'][$i]); } } } return $sidebars_widgets; }