Intereting Posts
как проверить, установлена ​​ли на первой странице статическая страница WordPress Customizer sanitize_callback: как сбросить значение по умолчанию при сбое Мета-окно WordPress и флажок-список Ошибка 404 в пользовательском типе сообщения Как одновременно обращаться к одной и той же базе данных MySQL в главном столбце и боковой панели WordPress? обнаруживать, когда пользовательский пост создается в первый раз wp_nav_menu показать только 1 сообщение Получить таксономию типа публикации Правильный способ работы с wpdb для получения первого имени пользователя Имеет ли WordPress код «по умолчанию» для анти-SQL, который отвечает ошибкой 404? используйте __ ($ str) для перевода строк (symfony / twig) категория URL-структуры Обзор категорий, ссылающийся на страницу, отображающую сообщения Гравитация Пользовательские теги слияния Отображение чего-то в заголовке после загрузки всех стилей

Вызовите 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; }