Всем привет!
Версия 16.22.0 плагина WP-Recall принесло массу новых и интересных фишек и в этой статье мы рассмотрим новое API опций плагина, его возможности и порядок применения.
По ходу своего развития плагин WP-Recall уже дважды менял порядок формирования опций, предыдущая версия описана в этой статье, и хотя та инструкция устарела, но мы можем также обратить на нее внимание, поскольку порядок формирования массива самой опции остался прежним. Кстати, опции добавленные по прежнему варианту будут плагином поддерживаться, но это временно, а потому, будет уместно в подробностях рассмотреть новый подход.
Итак, первое на что обратим внимание - опции добавляются через фильтр 'rcl_options'. Данный фильтр передает объект, а не строку, как это было в предыдущем варианте. С объектом гораздо удобнее работать и возможностей он предлагает значительно больше, это мы увидим ниже.
Оболочка добавления опции будет выглядеть как то так
add_filter( 'rcl_options', 'my_new_options' ); function my_new_options( $options ) { //тут будем добавлять опции return $options; }
Давайте разберем, что представляет из себя объект $options. Нас могут заинтересовать предлагаемые им методы:
//добавление нового блока опций //возвращает объект созданного блока опций ->add_box($box_id, $args) //проверка существования указанного блока опций ->isset_box( $box_id ) //получение указанного блока опций //возвращает объект блока опций ->box( $box_id )
Мы можем видеть, что по сути объект $options позволяет работать только с блоками опций.
Если вы посмотрите на любой менеджер опций плагина WP-Recall, то вы сможете заметить, что все опции на странице находятся внутри внутри групп опций, которые в свою очередь находятся уже внутри блоков, т.е. структура менеджера опций имеет следующую структуру:
-> Блок опций -> Группа опций -> Опции
Вот и объект $options, который мы пытаемся рассматривать позволяет нам работать только с блоком опций, он не даст нам доступ сразу к группе опций или к какой то отдельной опции. Но мы можем получить доступ к группе опций из блока и к отдельной опции из группы, где эта опция находится.
Давайте рассмотрим работу с указанной иерархией на примере создания нового блока опций через метод add_box().
Сначала создадим новый блок опций:
$options->add_box( 'unique-id', array( 'title' => __( 'Settings box' ), 'icon' => 'fa-cog' ) );
Первым аргументом при создании нового блока настроек необходимо передать уникальный, в рамках текущего менеджера опций, идентификатор блока опций, по которому мы в дальнейшем сможем обращаться к этому блоку. Вторым аргументом передаем массив настроек, где указываем заголовок и иконку.
Если посмотреть в менеджер опций, то мы создали новый пункт в меню опций текущего менеджера и большой контейнер для заполнения опциями разбитыми на группы.
Давайте заполним этот контейнер, создадим группу опций. Чтобы создать группу опций в определенном блоке опций нам необходимо обратиться к одному из уже созданных блоков по его идентификатору, получить этот блок и вызвать из него метод add_group():
$options->box( 'unique-id' )->add_group( 'group-id', array( 'title' => __('Settings group title') ) );
Тут мы обратились к созданному нами выше блоку с идентификатором 'unique-id', вызвали из него метод add_group() и передали в него два аргумента: идентификатор группы, по которому мы будем к этой группе обращаться далее и массив необязательных параметров, в котором указали наименование группы.
Теперь в созданную группу опций можно добавлять сами опции. Для этого мы должны обратиться к блоку опций, вызвать нужную группу и вызвать из группы метод add_options(), куда и передать необходимые опции красивым массивом:
$options->box( 'unique-id' )->group( 'group-id' )->add_options( array( array( 'type' => 'text', 'slug' => 'text_slug', 'title' => __('Title field'), 'placeholder' => __('placeholder of field') ), array( 'type' => 'select', 'slug' => 'select_slug', 'title' => __('Title field'), 'values' => array( __( 'Disabled' ), __( 'Enabled' ), ) );
Выше мы добавили две опции в группу 'group-id' блока 'unique-id'. Я не буду останавливаться на порядке формирования массива опций, ранее мы его подробно разбирали. Полный код будет выглядеть так:
add_filter( 'rcl_options', 'my_new_options' ); function my_new_options( $options ) { //создаем блок опций $options->add_box( 'unique-id', array( 'title' => __( 'Settings box' ), 'icon' => 'fa-cog' ) ); //создаем группу опций $options->box( 'unique-id' )->add_group( 'group-id', array( 'title' => __('Settings group title') ) ); //добавляем опции $options->box( 'unique-id' )->group( 'group-id' )->add_options( array( array( 'type' => 'text', 'slug' => 'text_slug', 'title' => __('Title field'), 'placeholder' => __('placeholder of field') ), array( 'type' => 'select', 'slug' => 'select_slug', 'title' => __('Title field'), 'values' => array( __( 'Disabled' ), __( 'Enabled' ), )) )); return $options; }
Но мы можем не разбивать весь код на три шага, мы можем выполнять все действия на лету, сократив код таким образом:
add_filter( 'rcl_options', 'my_new_options' ); function my_new_options( $options ) { $options->add_box( 'unique-id', array( 'title' => __( 'Settings box' ), 'icon' => 'fa-cog' ) )->add_group( 'group-id', array( 'title' => __('Settings group title') ) )->add_options( array( array( 'type' => 'text', 'slug' => 'text_slug', 'title' => __('Title field'), 'placeholder' => __('placeholder of field') ), array( 'type' => 'select', 'slug' => 'select_slug', 'title' => __('Title field'), 'values' => array( __( 'Disabled' ), __( 'Enabled' ) ) ) )); return $options; }
В результате мы получим примерно такие опции
Опишу еще один полезный кейс, позволяющий немного сократить код регистрации опций (спасибо Владимиру за идею и настойчивость). Если у вас опций немного и разбивать их на разные группы внутри блока не требуется, то можно из блока вызвать метод add_options(), куда сразу передать массив с опциями. Группа будет создана автоматически в фоновом режиме с идентификатором 'default' и заголовком "Общие настройки". В таком случае, код будет выглядеть так:
add_filter( 'rcl_options', 'my_new_options' ); function my_new_options( $options ) { $options->add_box( 'unique-id', array( 'title' => __( 'Settings box' ), 'icon' => 'fa-cog' ) )->add_options( array( array( 'type' => 'text', 'slug' => 'text_slug', 'title' => __('Title field'), 'placeholder' => __('placeholder of field') ), array( 'type' => 'select', 'slug' => 'select_slug', 'title' => __('Title field'), 'values' => array( __( 'Disabled' ), __( 'Enabled' ) ) ) )); return $options; }
Порядок создания новых блоков, групп и опций мы разобрали, но новое API дает нам чуть больше. Одним из наиболее важных преимуществ нового API является возможность добавлять группы и опции в уже ранее созданные блоки и группы опций, даже если они были добавлены сторонними дополнениями. Если мы хотим добавить в уже существующий блок опций свою группу, то нам лишь необходимо знать идентификатор этого блока, соответственно, если мы хотим добавить опцию в какую-либо группу опций, то нам нужны идентификаторы блока и группы, куда опция будет добавляться. На данном этапе, идентификаторы блока и группы можно узнать только через исходный код. Например, блок "Общие настройки" имеет идентификатор 'primary', а группа "Оформление" внутри этого блока - идентификатор 'design':
А значит, чтобы добавить свои опции в группу "Оформление", предварительно проверив нужный блок на существование, мы можем сформировать следующий код:
if($options->isset_box( 'primary' )){ $options->box( 'primary' )->group( 'design' )->add_options( array( //тут массивы добавляемых опций )); }
Такой подход очень удобен для расширения перечня опций определенного блока или группы, например, из дочерних дополнений, избавляя от необходимости регистрировать новый блок опций специально для этого дополнения.
В следующей статье посвященной опциям плагина я расскажу как можно сформировать в дополнении свой собственный менеджер опций и сохранять через него опции в отдельный массив.
Обязательно задавайте свои вопросы и предложения в комментариях.
Всем хорошего дня!
Существующие опции можно будет редактировать?
Например таймаут активности имеет диапазон от 1 до 20, можно ли будет сделать его, например 1 - 30, или title опции изменить?
Андрей умеет продлить рабочий день для всех, даже если он выходной, изучаю))
Это 3-я версия апи настроек. Вторая версия - все еще поддерживается ядром и совместима. Но вот первая - полный улёт. А таких допов у меня 20-ть... что делать? - спать идти))
Только спать, все как в сказке будет...утро вечера мудренее. Может какие-то временно приостановить, пока время и желание не появится?
Будем действовать по сигналам извне. Если все молчат - значит либо всё хорошо, либо никто не использует. Так экономим время. Ну а если без смеха - первым делом премиум пройдусь. Бесплатные - на самый последний этап.
Точно, самое мудрое решение, так и я буду действовать.
Владимир, а что сигнализировать, если в 90% дополнений в т.ч. и премиум я не могу сохранять изменения в настройках.
Хотя нет, наверно остановлю некоторые, один платный также по асгарасу или не один)). Слишком много опций сделал в некоторых, а время пока нет. Только продумаю как это лучше сделать.
Упс, отправил коммент, а не ответ.
Вообщем переделал первый доп под новые опции. В целом все понятно. Попутно изучил как это реализовано.
Редактировать опции можно!
Например если мы хотим добавить в опцию "Порядок вывода личного кабинета" наше значение, это можно сделать так:
$options->box('primary')->group('office')->options['view_user_lk_rcl']->values[] = 'My value';
Я бы предложил добавить в class-rcl-options-group.php метод
function get_option($option_id){
return $this->options[$option_id];
}
Тогда можно будет изменить опцию так:
$options->box('primary')->group('office')->get_option('view_user_lk_rcl')->values[] = 'My value';
или так:
$option = $options->box('primary')->group('office')->get_option('view_user_lk_rcl');
$option->values[] = 'My Value';
$option->title = 'Новый title опции';
Добавлять отдельный метод типа set_option думаю излишне. Не думаю что этот функционал будет использоваться часто, а учитывая что поле опции может быть строкой, массивом, объектом и т.п. - реализация будет сложной
Счастливый человек, разобрался и переделал. Я вот к сожалению останавливаю все свои допы, в которых пропали настройки, просто нет возможности переделать старые, а которых куча опций. Возможно, только буду в новых, если будут у меня, делать уже по новому.
Честно говоря, не озадачивался идеей менять уже существующие опции, но если все получилось, то отлично. Добавлю предложенный метод в след. обновлении, спасибо.
Может как то пометить допы с первым вариантом, просто во всех текст переделать можно, добавить плашку. Но вот в поддерживаемой версии все равно написано "выше" какой.
Просто переделывать точно не буду, а придется отвечать на вопросы постоянно, почему на такой-то версии не работает. Хотя может просто в черновики все убрать, запутался)
В общем, проанализировал я ситуацию с дополнениями своими ночью, поковырялся и пришел к выводу. Останавливаю развитие всех первой версии аpi, вторая работает пока не выйдет окончательно 3 версия, переделать мне не реально, в общей сложности тыщенка опций наверно и все переписать нет возможности.
Как дойдут руки, подумаю что сделать с допами в каталоге, так как поддерживать их переход на новое api не буду.
Игорь, ну тогда только товары убирать в черновики. Как я понял, ты продолжал до наших дней практику использования опций по варианту 2014 года, который устарел уже в 2017.
Жаль конечно, что такая ситуация сложилась, но я думаю, это последний раз когда опции плагина переживают такое обновление, хотя критичным его можно назвать только по отношению к варианту шестилетней давности.
Я ее использовал только в старых допах, после появления 2 версии апи, его использовал, но и она я так понял скоро уйдет в историю.
Но возможности переписать все у меня нет.
Поэтому, как дойдут руки, удалю/уберу в черновики все или буду убирать после комментов, когда замечу и тд., что нет опций.
Жаль конечно, но все движется вперед, даже если так резко.
Ну смотри, перевести опции со второй версии АПИ на последнюю на самом деле достаточно просто, массивы опций остались неизменны, изменилось лишь окружение для них. Создаешь блок, одну группу и пихаешь туда все опции единым массивом, просто копируешь и готово.
А вот перевести с первой версии, да, сложнее.
Я обязательно посмотрю, как появится возможность.
чувствую надо стрим по теме опций провести)
Загружал сейчас новую версию допа предупреждений о куках и сайт подвис у меня, ну все против))
Пошел пить кофе, похоже нужна пауза)
Игорь - ну сегодня только ещё вторник и только ещё 1-е число. Если упереться и раскачаться - то всё получится))
Ща кофейку попью, налью новый и посмотрю самый свой популярный доп на наличие в нем 'option_block' - это первый способ настроек. Хотя по опыту - перевод с 1-й на 2-ю у меня не вызвал проблем. Просто надоело и я забил)) Теперь вот разгребать. Так и жили.
Так что эти глобальные изменения ядра - шаг к 17-й версии. Иначе еще год к ней бы шли. А удобства хочется уже сейчас. Темболее многим частям более года - но не было в релизе.
Я напоминаю, что если кому то из разработчиков потребуется ftp-доступ к файлам своих товаров на сервере, то можете обращаться в личку. По моему мнению, обновление товаров по ftp - более удобный и быстрый вариант, чем необходимость загружать архив через форму публикации.
Вот жеж, прочитал пост твой, только когда уже закинул все архивы))
Все что мог обновил, осталось один платный, но там много гемора и пока прикрыл его.
с 16.22.5 можно проще создавать настройки - без указания группы https://pastebin.com/tgNnnGKt
Если опции в одной группе - писать меньше кода придется
Теперь точно время выберу и на примере отложенного в обработку допа с первой версией, все пройдусь. Уж больно много настроек я наделал. Спасибо.)
Дополнил статью описанием такой возможности, спасибо.
Предложение: в тип поля text указывать атрибут для вызова иконпикера - чтобы можно было в своих настройках дать пользователям использовать его
https://yadi.sk/i/9Ww3NjSV87NwJA
В одном из своих дополнений увидел что "вы можете вписать иконку тут" в опциях - вспомнил что есть в реколл теперь удобный пикер и с поиском еще - просто бомба...
Сам пока не делал изыскания - может уже прям сейчас есть способ легко туда https://yadi.sk/i/ofNOi6Ab4t7oEw добавить иконпикер
Кто за?
скрипт иконпикера в менеджере полей подрубается автоматически, чтобы добавить текстовому полю вызов этого скрипта, просто укажи ему класс
'class' => 'rcl-iconpicker'
а если находишься не в менеджере полей, а например в опциях, то дополнительно инициализируй подключение скриптов вызвав функцию
rcl_iconpicker();
С 16.24.10 - отработало отлично. Спасибо!