Публикация в группе: Плагин WP-Recall - Личный кабинет на WordPress

Категории группы: Полезное

Всем привет!

Версия 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(
	//тут массивы добавляемых опций
    ));

}

Такой подход очень удобен для расширения перечня опций определенного блока или группы, например, из дочерних дополнений, избавляя от необходимости регистрировать новый блок опций специально для этого дополнения.

В следующей статье посвященной опциям плагина я расскажу как можно сформировать в дополнении свой собственный менеджер опций и сохранять через него опции в отдельный массив.

Обязательно задавайте свои вопросы и предложения в комментариях.

Всем хорошего дня!

3

Автор публикации

не в сети 59 минут

Андрей CS

12K
рассматриваю задания
Комментарии: 2742Публикации: 481Регистрация: 30-11--0001Продаж/Покупок: 0/0