Widget Logic
Этот плагин добавляет каждому виджету дополнительное поле "Widget logic", которое позволяет контролировать, при каких условиях должен отображаться виджет. В текстовом поле можно использовать любой PHP-код (например функции условных тегов).
Настройка и параметры находятся в стандартном интерфейсе админки виджетов.
ВНИМАНИЕ: Код, который вы вводите в поле логики, исполняется с помощью eval()
. Любой, кто имеет доступ к редактированию виджетов, сможет добавить вредоносный или разрушительный код. Есть фильтр widget_logic_eval_override, который позволяет вам переопределить исполнение логики без использования eval()
.
ОБНОВЛЕНИЕ (v6.0.0):
-
Теперь вы можете управлять логикой виджетов в редакторе Gutenberg, а не только в классическом редакторе.
- Предустановленные виджеты позволяют добавлять специальные виджеты одним нажатием. Первый из них — Live Match, отображает случайный матч с обновляемым счётом, логотипами команд, временем матча, названием турнира и т.д. В будущем будут добавлены другие интересные виджеты.
Настройка
Помимо логики, задаваемой для виджетов, на странице управления виджетами доступны 3 параметра:
- Использовать wp_reset_query — может помочь, если условные теги работают некорректно из-за сторонней темы или плагина.
-
Момент выполнения логики — определяет, когда выполнять код логики. Опции:
- после загрузки темы - after_setup_theme
- после загрузки PHP - wp_loaded
- после установки query-переменных parse_query — значение по умолчанию
- в момент wp_head
- Не кэшировать результаты логики — с версии 0.58 логика выполняется один раз, но если это вызывает проблемы, включите этот параметр, чтобы выполнять каждый раз.
Взаимодействие с внешними сервисами
Widget Logic использует внешний сервис widgetlogic.org для получения актуальных данных о футбольных матчах. Данные обновляются в реальном времени без перезагрузки страницы.
Написание логики
Текст в поле логики — это PHP-код, который должен возвращать true
, чтобы виджет отображался. Если нет return
, он добавляется автоматически.
Основы:
!
— отрицание —!is_home()
||
— или —is_home() || is_single()
&&
— и —is_home() && is_user_logged_in()
Примеры:
// Главная страница блога is_home() // Везде, кроме страницы "О нас" !is_page('about') // Только для неавторизованных пользователей !is_user_logged_in() // Страница одной из указанных категорий (по ID) is_category( [ 5, 9, 10, 11 ] ) // Одиночный пост в категории с ярлыком 'baked-goods' is_single() && in_category('baked-goods') // Только для пользователей с правами администратора current_user_can('level_10') // Если пользователь пришёл с поиска в Google strpos( $_SERVER['HTTP_REFERER'], "google.com" ) != false // Страница категории, являющейся дочерней от категории с ID 5 is_category() && in_array( $cat, get_term_children( 5, 'category' ) ) // Страница, являющаяся дочерней от страницы с ID 77 global $post; return in_array( 77, get_post_ancestors($post) ); // Домашняя страница или дочерняя страница с родителем ID 13 global $post; return is_page('home') || ( $post->post_parent == 13 );
Фильтр widget_logic_eval_override
Перед выполнением логики код передается через фильтр. Если возвращено логическое значение, оно используется вместо выполнения кода.
FAQ
Поддерживается ли Gutenberg?
Да, начиная с версии 6.0.0 поддерживаются и классические, и Gutenberg-виджеты.
Что делать, если не работает?
- Смените тему на стандартную.
- Включите опцию wp_reset_query.
- Попробуйте другой момент выполнения логики.
- Включите выполнение логики больше одного раза, если выбрали ранний момент загрузки.
Ошибка eval()'d code on line 1?
Ошибка синтаксиса в PHP-коде. Удаляйте логику по очереди, пока не найдете ошибочную строку. Используйте экспорт/импорт опций для сохранения.
Конфликт с WooCommerce или другим плагином?
Попробуйте сменить момент выполнения логики.
Почему в сайдбаре появляется текст по умолчанию?
Если в сайдбаре нет виджетов, тема может отображать дефолтный контент. Добавьте пустой текстовый виджет в конец.
Как вывести виджет только на главной?
Используйте is_front_page() — для статической или записей. is_home() — для страницы с постами (определяется в Настройки > Чтение).
is_page() не работает?
Исправлено с версии 5.7.0. Включите wp_reset_query, если тема вызывает sidebar после loop.
Как отобразить виджет на странице категории и в постах этой категории?
is_category(X) || (is_single() && in_category(X))
Логика для X, Y и Z?
Используйте логический AND: X && Y && Z.
Почему плагин такой сложный?
Так задумано. Плагин — для гибкости через код, без UI. UI можно найти в Widget Context.
Виджеты появляются, когда не должны
- Проверьте wp_reset_query().
- Уточните условие:
is_single() && in_category('cheese')
вместо простоin_category()
.