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().