Умови елементів

Умови елементів дозволяють визначити одну або кілька умов для будь-якого елемента. Тільки якщо ці умови виконуються, елемент відображається на фронтальному кінці.

Умови перевіряються на сервері і призначені для фільтрації/не завантаження елемента на основі даних (пост, користувач, динамічні дані, дата та час тощо).

Невідображення елемента означає HTML елемента не існує в вихідному коді.

Це ідеально підходить для обмеження контенту лише для користувачів, які увійшли в систему, або користувачів з певною роллю (наприклад, сайти членства) для приховування інформації, що є чутливою до часу, відповідно до певного дня тижня/дати/часу, на основі динамічних даних тощо.

Якщо вам потрібна повна програмна потужність для визначення умов вашого елемента, використовуйте фільтр Esl esl/element/render.

ВАЖЛИВО: Умови елементів не застосовуються в двигуні!

Доступ до умов

При редагуванні елемента натисніть на значок “Умови” (перемикач) у заголовку панелі, щоб відкрити/закрити інтерфейс умов елемента. Ви побачите значок перемикача “Умови” у структурній панелі, якщо елемент має умови. Натисніть на значок, щоб перейшти безпосередньо в інтерфейс умов для цього елемента.

Як працюють умови елементів

Принаймні один набір умов має бути виконаний для відображення елемента. Це означає, що всі умови в наборі умов повинні бути оцінені як істинні.

Отже, існує відношення OR між наборами умов і відношення AND між умовами всередині набору.

Щоб додати свій перший набір умов, натисніть на значок “+” поруч із заголовком “Умови”:

Тепер у нас є один набір з однією умовою. Кожна умова складається з трьох наступних властивостей:

  • Ключ (ID поста, роль користувача, дата, динамічні дані тощо)
  • Операнд порівняння (==, !=, >, <, містить, до, після тощо)
  • Значення (числове, текстове, прапорець, вибір опції(й) тощо)

Припустимо, ми хочемо показати елемент лише для користувачів, які увійшли в систему. Ми створимо таку умову:

Цей елемент відображається лише тоді, коли особа, яка переглядає цю сторінку, увійшла в систему.

Неавторизовані гості, боти, краулери тощо не зможуть побачити цей елемент (оскільки його немає в вихідному коді).

Індикатор умов

Зверніть увагу на підсвічений значок “Умови” на скріншоті вище. Це чудовий індикатор, який дозволяє швидко побачити, чи має елемент, який ви редагуєте, які-небудь умови (не відкриваючи інтерфейс умов).

Іконка “Умови” (перемикач) також видна поруч з елементом у панелі структури, що дозволяє швидко переглядати умови елементів на вашій сторінці. Клік на неї перенесе вас прямо в інтерфейс умов.

Перевірка кількох умов

Між набором умов існує АБО відношення. А умови в межах одного набору мають І відношення.

Давайте створимо другий набір умов (натиснувши на іконку “+” у верхньому правому куті знову), щоб проілюструвати це.

Умова в цьому новому наборі виконується (істинна), якщо заголовок поста – “Рахунок”.

Оскільки між наборами умов існує відношення АБО, елемент відображається, якщо (1) користувач увійшов в систему АБО (2) заголовок переглянутого поста/сторінки – “Рахунок”.

Поєднання умов І та АБО

Давайте розширимо умови для цього елемента, перевіривши, чи був увійшов користувач зареєстрований до 1 січня 2022 року.

Оскільки в межах набору існує відношення І, ми натиснемо кнопку “+” у нижньому правому куті нашої першої умови, щоб додати ще одну умову до цього першого набору ось так:

Ви також помітите вертикальну мітку “І” між умовами всередині набору.

І горизонтальну мітку “АБО” між наборами умов.

Сподіваємося, це допоможе краще візуалізувати логіку умов елементів.

Як порівняти динамічні дані з значенням

Умови елемента, за замовчуванням, порівнюють з етикеткою.

Деякі поля провайдера динамічних даних дозволяють вказати значення та етикетку (наприклад, ACF true false, список чекбоксів Metabox, радіо, вибір тощо).

Щоб порівняти з значенням замість цього, ви можете використовувати фільтр :value ось так:

У наведеному вище прикладі умова виконується, коли в списку чекбоксів Metabox вибрано значення blue. Без фільтра :value умова порівнювала б з етикеткою опції чекбокса.

API умов елементів

Наступна інформація призначена для розробників, які бажають програмно розширити інтерфейс умов елементів за замовчуванням (@since 1.8.4).

Належна умовна конструкція, яку ми створимо, повинна бути схожою на наступний приклад:

Двигун: нова група умов із опцією “Тип поста”

Крок 1: Додати групу умов через фільтр: esl/conditions/groups

add_filter( 'esl/conditions/groups', 'add_my_condition_group' );function add_my_condition_group( $groups ) {// Переконайтесь, що назва вашої групи є унікальною (краще префіксувати)$groups[] = ['name'  => 'my_group','label' => esc_html__( 'Моя група', 'my-plugin' ),];return $groups;}

Крок 2: Додати параметри умов через фільтр: esl/conditions/options

У цьому прикладі ми створимо нову умову для порівняння типу запису поточної сторінки з значенням користувача. Порівняння – це спадне меню з варіантами “є” і “не є”. Поля значення – це поле text.

add_filter( 'esl/conditions/options', 'add_my_custom_condition' );function add_my_custom_condition( $options ) {// Переконайтеся, що ключ є унікальним і що група існує$options[] = ['key'   => 'my_post_type','label' => esc_html__( 'Тип запису (Новий)', 'my-plugin' ),'group' => 'my_group','compare' => ['type'        => 'select','options'     =>  ['==' => esc_html__( 'є', 'my-plugin' ),'!=' => esc_html__( 'не є', 'my-plugin' ),],'placeholder' => esc_html__( 'є', 'my-plugin' ),],'value'   => ['type'        => 'text',],];return $options;}
Очікуваний результат: Нова умова в системі

Крок 3: Виконайте вашу логіку, щоб повернути логічний результат через фільтр: esl/conditions/result

На основі вашої власної логіки, поверніть true або false для вашої умови. Esl сама враховує умови OR та AND.

У цьому прикладі ми перевіряємо, чи збігається тип запису з значенням користувача.

Якщо умова виконується, поверніть true.

Ви можете отримати доступ до змінної $condition, яка була встановлена всередині системи.

add_filter( 'esl/conditions/result', 'run_my_custom_condition', 10, 3 );function run_my_custom_condition( $result, $condition_key, $condition ) {// Якщо $condition_key не 'my_post_type', ми повертаємо $render як єif ( $condition_key !== 'my_post_type' ) {return $result;}// Тепер ви можете виконати свою логіку, використовуючи змінну $condition// $condition['compare'] - це оператор порівняння, може бути пустим// $condition['value'] - це значення користувача, може бути пустим// У моєму прикладі, якщо порівняння пусте, ми встановлюємо його значення за замовчуванням '=='$compare    = isset( $condition['compare'] ) ? $condition['compare'] : '==';$user_value = isset( $condition['value'] ) ? $condition['value'] : '';$condition_met = false;// Отримати тип посту поточної сторінки$current_post_type = get_post_type();switch( $compare ) {case '==': // "є"$condition_met = $current_post_type === $user_value;break;case '!=': // "не є"$condition_met = $current_post_type !== $user_value;break;}return $condition_met;}

Якщо ви додали кілька варіантів в одну групу, ви можете націлити їх так:

add_filter( 'esl/conditions/result', 'run_my_custom_condition', 10, 3 );function run_my_custom_condition( $result, $condition_key, $condition ) {$condition_options = EslConditions::$options;$registered_condition = $condition_options[ $condition_key ];if ( $registered_condition['group'] !== 'my_group' ) {return $result;}// Тепер ви можете виконати свою логіку, використовуючи змінну $condition// $condition['compare'] - це оператор порівняння, може бути пустим// $condition['value'] - це значення користувача, може бути пустим$condition_met= false;switch( $condition_key ) {case 'my_condition_option_1':// Приклад$condition_met = execute_my_logic_1( $condition );break;case 'my_condition_option_2':// Приклад$condition_met = execute_my_logic_2( $condition );break;}return $condition_met;}