Проверка активности зарегистрированного сайдбара и наличия в нем виджетов
Я хочу проверить, содержит ли зарегистрированный сайдбар виджеты - но не могу найти подходящую функцию 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

Вы можете проверить, активен ли сайдбар и используется ли он (содержит ли виджеты с контентом), используя функцию 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

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

На основе принятого ответа я решил свою проблему с помощью этой функции, надеюсь, она поможет. Спасибо, 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;
}
