Всем привет!
Очередное обновление плагина 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 часто выручал меня в работе, избавляя от довольно рутинного перебора полученных из БД данных, ускорял разработку и помогал экономить время для более интересных и полезных вещей. Надеюсь он найдет применение и в вашей работе.
Буду рад вашим вопросам и предложениям в комментариях. Всем удачи!
Перестали работать ссылки публикаций в ЛК.