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

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

Всем привет!

Очередное обновление плагина WP-Recall принесло нам очередную полезную плюшку - новый класс Rcl_Walker. Данный класс призван облегчить работу с результатами выборки данных из БД в виде массива объектов.

Нередки ситуации, когда разработчику приходиться работать с полученным из БД массивом объектов, получая из него определенные данные по каким-либо критериям по ходу работы функции/метода. Иногда данная задача решается несколькими запросами в БД для получения данных по этим критериям или после получения всех данных одним массивом получать данные прогоняя массив через череду циклов. Лучшим решением в данной ситуации станет использование класса Rcl_Walker.

Класс Rcl_Walker - вспомогательный обходчик массива объектов, который может "пройтись" по полученному массиву и отдать вам новый массив согласно указанных разработчиком параметров.

Рассмотрим порядок работы с классом и его методами.

При своей инициализации класс принимает только один параметр - массив объектов, с которым он и будет работать.

$walker = new Rcl_Walker($arrayObjects);

полученный объект $walker будет иметь только одно свойство items, где и будет находиться переданный массив.

Метод get_items($args) - основной метод класса, предназначен для получения массива объектов согласно переданных параметров.

Параметры передаются в виде массива и указывают на перечень соответствий, которые должны быть учтены при формировании нового массива. Параметры указываются в виде 'ключ' => 'значение', где 'значение' может быть числом, строкой или массивом. Например, имея начальный массив вида

Array(
	Object(
		'key1' => 'value1',
		'key2' => 'value2',
		'key3' => 'value3'
	),
	Object(
		'key1' => 'value4',
		'key2' => 'value5',
		'key3' => 'value6'
	),
	Object(
		'key1' => 'value7',
		'key2' => 'value8',
		'key3' => 'value9'
	)
)

Мы можем получить нужные нам данные, передав параметры

->get_items([
	key1 => value1,
	key2 => [value2, value8]
]);

В результате метод вернет нам первый и третий объекты из массива, тк только они удовлетворяют условиям выборки.

Метод get_item($key, $value) - позволяет получить один объект по переданным ключу и его значению. Например

->get_item('key2', 'value5');

Результат вернет нам второй объект. В данном случае, следует учитывать, что переданным аргументам могут соответствовать несколько объектов в массиве, но будет возвращен только первый, где условие выполнилось.

Метод get_item_value( $key, $value, $getKey ) - позволяет получить одно значение по ключу $getKey из объекта удовлетворяющему условию $key => $value.

->get_item_value( 'key1', 'value7', 'key3' );

Результат вернет нам значение 'value9' из третьего объекта.

Метод get_field_values( $key ) - возвращает массив значений из всех объектов по переданному ключу. Например

->get_field_values( 'key2' );

Результат вернет простой массив значений

array('value3', 'value6', 'value9');

Метод get_index_values( $indexKey, $valueKey ) - интересный и востребованный метод, позволяет получить массив ассоциативный массив, в котором ключом будет являться значение свойства $indexKey объекта, а значением - значение свойства $valueKey. Например

->get_index_values( 'key1', 'key3' );

Будет получен массив

array(
	'value1' => 'value3', 
	'value4' => 'value6', 
	'value7' => 'value9', 
);

Также есть пара вспомогательных методов

->is_set( $key, $value ) - проверяет простое наличие объекта по соответствию $key => $value, возвращает true/false
->count($args) - возвращает кол-во найденных объектов по переданным параметрам, передаваемые параметры соответствуют методу get_items()

 

Класс Rcl_Walker очень часто востребован при работе с результатами выборки из БД, поэтому его можно вызвать прямо из класса Rcl_Query, что очень удобно. Например

//получаем результаты из БД в "обходчике"
$walker = RQ::tbl(new tableQuery())
	->select(['value1', 'value2'])
	->where([
		'value1__in' => [1,2,3],
		'value2' => 'string'
	])
	->get_walker();
			
//начинаем получать данные с помощью walker`a
$values = $walker->get_field_values('key1');

$objects = $walker->get_items([
	'key1' => 'value2'
]);

Также делюсь полезным кейсом, когда необходимо в настройки дополнения необходимо добавить опцию выбора страниц, для этого следует сформировать и передать в массив опции массив страниц, где ключом будет ID страницы, а значением - наименование страницы:

$options = [
	[
		'slug' => 'page',
		'type' => 'select',
		'title' => __('Выбор страницы'),
		'values' => RQ::tbl(new Rcl_Query([
			'name' => $wpdb->posts, 
			'cols' => ['ID', 'post_type', 'post_title']
		]))
		->select(['ID', 'post_title'])->where(['post_type' => 'page'])->limit(-1)
		->get_walker()->get_index_values( 'ID', 'post_title' )
	]
];

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

array(
    114 => 'Публикация первая',
    125 => 'Публикация вторая',
    132 => 'Публикация третья'
);

Данный пример демонстрирует возможности совместной работы API произвольных полей плагина, а также классов Rcl_Query и Rcl_Walker.

Функционал класса Rcl_Walker часто выручал меня в работе, избавляя от довольно рутинного перебора полученных из БД данных, ускорял разработку и помогал экономить время для более интересных и полезных вещей. Надеюсь он найдет применение и в вашей работе.

Буду рад вашим вопросам и предложениям в комментариях. Всем удачи!

2

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

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