В современном WordPress разработчики часто сталкиваются с необходимостью управлять контекстом отображения блоков и виджетов. Иногда нужно сделать так, чтобы определённый блок или виджет не отображался в специфических контекстах — например, на главной странице, в архиве или внутри определённых типов записей. В этой статье подробно рассмотрим, как добавить настройку отсутствия контекста для блоков и виджетов в WordPress, используя примеры кода и полезные плагины.
Что такое контекст отображения в WordPress и зачем его контролировать
Контекст отображения — это условия, при которых определённый элемент сайта показывается пользователю. Например, вы можете захотеть, чтобы виджет показывался только на страницах записей, но не на главной или в категории. Контроль контекста помогает оптимизировать структуру сайта, улучшить UX и управлять нагрузкой.
В классической теме WordPress это делается через условные теги, например is_home(), is_single(), is_category(). Для виджетов и блоков Gutenberg можно добавить более удобный UI для управления такими условиями.
Как реализовать настройку отсутствия контекста для виджетов
Для виджетов можно добавить специальное поле, которое позволит задать условия, при которых виджет скрывается. Это можно сделать через фильтр widget_display_callback.
Пример: добавляем настройку «Не показывать на главной»
function wppartner_widget_display_callback($instance, $widget, $args) {
if (isset($instance['hide_on_home']) && $instance['hide_on_home']) {
if (is_home() || is_front_page()) {
return false; // Скрываем виджет на главной
}
}
return $instance;
}
add_filter('widget_display_callback', 'wppartner_widget_display_callback', 10, 3);
// Добавляем поле в форму настройки виджета
function wppartner_widget_form($instance) {
$hide_on_home = isset($instance['hide_on_home']) ? (bool) $instance['hide_on_home'] : false;
?>
<p>
<input class="checkbox" type="checkbox" <?php checked($hide_on_home); ?> id="<?php echo esc_attr($this->get_field_id('hide_on_home')); ?>" name="<?php echo esc_attr($this->get_field_name('hide_on_home')); ?>" />
<label for="<?php echo esc_attr($this->get_field_id('hide_on_home')); ?>"><?php esc_html_e('Не показывать на главной', 'wppartner'); ?></label>
</p>
<?php
}
Этот код можно доработать для любых условий, используя встроенные условные теги WordPress.
Как добавить настройку отсутствия контекста для блоков Gutenberg
В редакторе Gutenberg для блоков можно добавить собственные атрибуты и панель настроек, которые позволят определить контекст отображения блока.
Пример: добавляем кастомный атрибут hideOnArchive и логику отображения
const { __ } = wp.i18n;
const { InspectorControls } = wp.blockEditor || wp.editor;
const { PanelBody, ToggleControl } = wp.components;
wp.blocks.registerBlockType('wppartner/hide-context-block', {
title: __('Блок с настройкой контекста', 'wppartner'),
icon: 'visibility',
category: 'widgets',
attributes: {
hideOnArchive: {
type: 'boolean',
default: false,
},
},
edit: (props) => {
const { attributes, setAttributes } = props;
return (
<>
<InspectorControls>
<PanelBody title={__('Настройки отображения', 'wppartner')} initialOpen={true}>
<ToggleControl
label={__('Скрыть на архивах', 'wppartner')}
checked={attributes.hideOnArchive}
onChange={(val) => setAttributes({ hideOnArchive: val })}
/>
</PanelBody>
</InspectorControls>
<div>
{__('Содержимое блока', 'wppartner')}
</div>
</>
);
},
save: (props) => {
const { attributes } = props;
// Сохраняем атрибут как data-атрибут
return (
<div data-hide-on-archive={attributes.hideOnArchive ? 'true' : 'false'}>
{__('Содержимое блока', 'wppartner')}
</div>
);
},
});
Далее на фронтенде можно с помощью PHP или JavaScript скрывать блоки с атрибутом data-hide-on-archive="true" при необходимости.
Реализация на PHP для скрытия блока на архивах
function wppartner_filter_gutenberg_blocks($block_content, $block) {
if (isset($block['attrs']['hideOnArchive']) && $block['attrs']['hideOnArchive']) {
if (is_archive()) {
return ''; // не выводим блок на страницах архивов
}
}
return $block_content;
}
add_filter('render_block', 'wppartner_filter_gutenberg_blocks', 10, 2);
Полезные плагины для управления контекстом отображения
Если не хочется писать код, можно использовать готовые решения:
- Widget Options – расширенные настройки виджетов, включая условия отображения.
- Content Aware Sidebars – позволяет создавать виджеты и боковые панели с условиями показа.
- Block Visibility – плагин для управления видимостью блоков Gutenberg с настройками контекста.
Также можно обратить внимание на плагины из WPShop.ru, например, Clearfy Pro, который содержит расширенные параметры оптимизации и управления выводом элементов.
Как расширить функционал: сложные условия показа
Иногда нужно не просто скрыть блок на главной, а сделать условия сложнее — например, показывать виджет только для определённой роли пользователя или когда пользователь не авторизован.
Для виджетов это можно реализовать через проверку в фильтре widget_display_callback:
function wppartner_widget_display_callback_advanced($instance, $widget, $args) {
if (!empty($instance['hide_for_roles'])) {
if (is_user_logged_in()) {
$user = wp_get_current_user();
$roles_to_hide = (array) $instance['hide_for_roles'];
if (array_intersect($roles_to_hide, $user->roles)) {
return false; // Скрыть для указанных ролей
}
}
}
return $instance;
}
add_filter('widget_display_callback', 'wppartner_widget_display_callback_advanced', 10, 3);
Для блоков Gutenberg аналогично можно добавить атрибуты и проверять их в фильтре render_block.
Итог
Добавление настройки отсутствия контекста для блоков и виджетов — мощный инструмент для гибкого управления выводом элементов WordPress. Используя условные теги, фильтры widget_display_callback и render_block, а также расширяя редактор Gutenberg, можно создавать удобные интерфейсы для контроля показа контента.
Для быстрого старта рекомендуем попробовать плагин Clearfy Pro, который содержит готовые решения для управления контекстом и оптимизации вывода.