Проверка активности зарегистрированного сайдбара и наличия в нем виджетов

17 окт. 2012 г., 13:38:18
Просмотры: 22.9K
Голосов: 7

Я хочу проверить, содержит ли зарегистрированный сайдбар виджеты - но не могу найти подходящую функцию WordPress для этого - is_active_widget проверяет наличие контента, но не проверяет существование самого сайдбара.

function ql_widget( $widget, $widget_name, $element = 'sider' ){

    if ( $widget ) { // передано имя виджета ##
        
        // проверяем активен ли виджет - возвращаем html и контент виджета если да ##
        if ( is_active_sidebar( $widget ) ) { 

        echo '
        <div class="'.$element.'">';

            dynamic_sidebar( $widget );

         echo '</div>';

        } else {

            // выводим ошибку если запрошенный виджет не существует или пуст ##
            if ( ql_user_is_administator() ) { // пользователь администратор ##

                if ( dynamic_sidebar( $widget ) ) { // пустой ##

                    $message = 'empty';

                } else { // неверный ID или имя виджета ##

                    $message = 'error';

                }

?>
                <div class="error"><strong>Виджет <?php echo $message; ?>:</strong> 
                <?php echo $widget_name ? $widget_name : $widget ; ?></div>
<?php 


            }
        }
    }
}

Я вызываю эту функцию на странице так:

// загрузка виджета ##
// widget_id, имя виджета, класс контейнера ##
ql_widget( 'sidebar-general', 'Стандартный сайдбар', 'sider' );

Сайдбары корректно зарегистрированы с помощью register_sidebar() и каждому назначен уникальный ID.

В настоящее время эта функция возвращает ошибку администратору, если виджет отсутствует или пуст - я хотел бы иметь возможность настроить сообщение об ошибке, чтобы указать, отсутствует виджет или пуст.

Спасибо!

ОБНОВЛЕНИЕ вот рабочая функция: ссылка на pastebin

0
Все ответы на вопрос 3
1
10

Вы можете проверить, активен ли сайдбар и используется ли он (содержит ли виджеты с контентом), используя функцию is_active_sidebar, вот пример...

if ( is_active_sidebar( $sidebar ) ) {
    // Отобразить текст
} else {
    // Ничего не отображать
};

Где $sidebar — это имя, ID или номер сайдбара, который вы хотите проверить.

Обновление:

Вот предложение по улучшению читаемости вашей функции:

function ql_widget( $widget, $widget_name, $element = 'sider' ){

    if ( $widget ) { 

        $message = (ql_user_is_administator() ? 'empty' : 'error');
        $widget_name = ($widget_name ? $widget_name : $widget);

        if ( is_active_sidebar( $widget ) ) { 

            $html  = '<div class="'.$element.'">';
            $html .= dynamic_sidebar( $widget );
            $html .= '</div>';
            echo $html;

        } else {

            $html  = '<div class="error"><strong>Виджет ';
            $html .= $message;
            $html .= '</strong> ';
            $html .= $widget_name;
            $html .= '</div>';
            echo $html;

        }
    }
} // Конец функции

И если вы хотите, чтобы сообщение об ошибке отображалось только для администратора, то оберните внутреннее содержимое блока else в дополнительное условие или замените else на elseif с проверкой на администратора, а затем, при необходимости, добавьте блок else для обработки остальных случаев, например, для обычных пользователей. Справка Codex: http://codex.wordpress.org/Function_Reference/is_active_sidebar

17 окт. 2012 г. 14:26:06
Комментарии

спасибо - я уже использую эту функцию - я хочу отображать боковую панель, если в ней есть виджеты, возвращать ошибку, если боковая панель названа неправильно, и ничего не делать, если она названа правильно, но пуста.

Q Studio Q Studio
17 окт. 2012 г. 14:45:20
3

wp_get_sidebars_widgets(); возвращает список всех сайдбаров и виджетов в каждом из них. Это позволяет проверить наличие сайдбаров без виджетов.

17 окт. 2012 г. 13:58:37
Комментарии

Бинго! - я обновлю ответ, чтобы показать решение, которое я использовал - спасибо

Q Studio Q Studio
17 окт. 2012 г. 14:50:45

Разве не для этого нужна функция is_dynamic_sidebar?

Adam Adam
17 окт. 2012 г. 15:04:11

это позволило мне проверить все 3 состояния: неправильное имя, пустое, отображать если всё в порядке...

Q Studio Q Studio
19 окт. 2012 г. 13:51:44
0

На основе принятого ответа я решил свою проблему с помощью этой функции, надеюсь, она поможет. Спасибо, Mridul Aggarwal.

// Проверяет, активен ли сайдбар и содержит ли он виджеты
function is_active_sidebar_with_content( $sidebar ) {

   // Получаем массив всех сайдбаров и их виджетов
   $sidebars = wp_get_sidebars_widgets();

   // Проверяем, существует ли указанный сайдбар и не пуст ли он
   if ( isset( $sidebars[ $sidebar ] ) && ! empty( $sidebars[ $sidebar ] ) ) {
       return true;
   }

   // Возвращаем false, если сайдбар не существует или пуст
   return false;
}
27 авг. 2021 г. 23:26:26