Иногда возникает необходимость полностью очистить боковую панель (sidebar) WordPress от всех виджетов программным способом. Это может понадобиться при смене темы, для оптимизации сайта или разработки собственного решения для управления виджетами.
Почему стоит удалять виджеты программно?
Удаление виджетов через админку — это понятно и просто, однако в ряде случаев нужно обеспечить автоматическую очистку виджетов, например, при активации темы или плагина. Такой подход гарантирует, что ненужные виджеты не будут загружаться, и пользователь не увидит устаревший или лишний контент.
Еще один кейс — когда вы создаете кастомный sidebar и хотите полностью контролировать его содержимое без старых виджетов.
Как устроены виджеты и сайдбары в WordPress
В WordPress виджеты сохраняются в опции sidebars_widgets. Эта опция — массив, где ключи — это идентификаторы сайдбаров, а значения — списки виджетов, закрепленных за этими сайдбарами.
Например, структура опции может выглядеть так:
array(
'sidebar-1' => [
'search-2',
'recent-posts-3'
],
'sidebar-2' => [
'categories-2'
],
'wp_inactive_widgets' => []
)Удалив виджеты из нужного сайдбара, вы фактически очистите его.
Как удалить все виджеты из всех сайдбаров
Чтобы программно очистить все сайдбары от виджетов, можно сбросить значение опции sidebars_widgets:
function wpmake_clear_all_widgets() {
// Получаем текущее значение
$sidebars_widgets = get_option('sidebars_widgets');
if (!is_array($sidebars_widgets)) {
return;
}
// Перебираем ключи — сайдбары
foreach ($sidebars_widgets as $sidebar_id => $widgets) {
// Не трогаем служебные ключи
if (in_array($sidebar_id, ['wp_inactive_widgets', 'array_version'])) {
continue;
}
// Очищаем список виджетов в сайдбаре
$sidebars_widgets[$sidebar_id] = [];
}
// Обновляем опцию
update_option('sidebars_widgets', $sidebars_widgets);
}Вы можете вызвать функцию wpmake_clear_all_widgets() при активации темы или плагина, например:
register_activation_hook(__FILE__, 'wpmake_clear_all_widgets');Удаление виджетов определенного сайдбара
Если нужно очистить конкретный сайдбар, например sidebar-1, используйте следующий код:
function wpmake_clear_sidebar_widgets($sidebar_id) {
$sidebars_widgets = get_option('sidebars_widgets');
if (!is_array($sidebars_widgets) || !isset($sidebars_widgets[$sidebar_id])) {
return;
}
$sidebars_widgets[$sidebar_id] = [];
update_option('sidebars_widgets', $sidebars_widgets);
}Вызов wpmake_clear_sidebar_widgets('sidebar-1'); удалит все виджеты из сайдбара с ID sidebar-1.
Как удалить виджеты из сайдбара с учетом сохранения в неактивных виджетах
По умолчанию, при удалении виджетов из сайдбара, они попадают в wp_inactive_widgets. Это позволяет не потерять настройки виджетов и вернуть их обратно при необходимости.
Если вы хотите полностью удалить виджеты, а не просто отключить их, придется очистить и опцию widget_{widget_type}, где хранятся настройки для каждого виджета.
Пример удаления настроек виджетов от конкретного типа:
function wpmake_delete_widget_settings($widget_base_id) {
$widgets = get_option('widget_' . $widget_base_id);
if (!is_array($widgets)) {
return;
}
// Удаляем все экземпляры виджетов данного типа
delete_option('widget_' . $widget_base_id);
}Чтобы узнать все типы виджетов, можно посмотреть ключи в базе данных с префиксом widget_.
Практический пример: очистка сайдбара и удаление настроек виджетов
Допустим, у вас есть сайдбар sidebar-1, в котором есть виджеты типа search и recent-posts. Нужно удалить все виджеты из sidebar-1 и сбросить настройки этих виджетов.
function wpmake_clear_sidebar_and_delete_widget_settings($sidebar_id) {
$sidebars_widgets = get_option('sidebars_widgets');
if (!is_array($sidebars_widgets) || !isset($sidebars_widgets[$sidebar_id])) {
return;
}
// Получаем список виджетов в сайдбаре
$widgets = $sidebars_widgets[$sidebar_id];
// Массив для хранения типов виджетов, которые нужно удалить
$widget_types_to_delete = [];
foreach ($widgets as $widget_id) {
// Виджет имеет формат: base_id-number, например recent-posts-2
$pos = strrpos($widget_id, '-');
if ($pos !== false) {
$base_id = substr($widget_id, 0, $pos);
$widget_types_to_delete[$base_id] = true;
}
}
// Очищаем сайдбар
$sidebars_widgets[$sidebar_id] = [];
update_option('sidebars_widgets', $sidebars_widgets);
// Удаляем настройки виджетов
foreach (array_keys($widget_types_to_delete) as $base_id) {
delete_option('widget_' . $base_id);
}
}Вызов wpmake_clear_sidebar_and_delete_widget_settings('sidebar-1'); удалит все виджеты из сайдбара и их настройки.
Интеграция с плагинами WPShop
Плагин My Popup позволяет создавать всплывающие окна, которые можно показать после очистки сайдбаров, чтобы уведомить пользователей о изменениях интерфейса.
Кроме того, если вы используете тему Root, очистка стандартных сайдбаров поможет подготовить сайт под кастомные виджеты из этой темы без конфликтов с предустановленными виджетами.
Заключение
Удаление виджетов из сайдбара программно — полезный инструмент для разработчиков и администраторов сайтов на WordPress. Вы можете использовать приведенные функции для быстрой очистки сайдбаров, сброса настроек виджетов и интеграции с пользовательскими решениями.
Внимательно тестируйте изменения в тестовой среде, чтобы избежать потери важных данных и настроек.