Компания Reaktiv Studios анонсировала выход новой библиотеки Locomotive, которая предназначена для массовой (пакетной) обработки данных.
Вообще, для этих целей уже создано огромное количество плагинов WordPress. К пакетной обработке данных относятся такие задачи, как одобрение всех ожидающих проверки комментариев, конвертация пользователей из одной роли в другую, перенос контента из одной структуры в другую и т.д. Это все те ситуации, в которых ручная обработка заняла бы очень много времени.
Представьте себе, что вам нужно получить большие объемы записей и выполнить простое действие с ними. Либо, к примеру, вы хотите управлять пользователями, комментариями, термами или любым другим встроенным типом записей WordPress. Написание отдельной функции, которая выполняет запрос и проводит изменения данных, является вариантом… в какой-то мере.
Часто мы работаем с тысячами записей. Один запрос даст слишком высокую нагрузку, потому его необходимо разбить на несколько запросов. В этом случае появляются задачи правильного смещения, отлова ошибок, выполнения шагов асинхронно – все это увеличивает сложность экспоненциально.
За последние годы мы привыкли работать с интерфейсом WP-CLI. Он помогает решить многие из подобных задач. Однако сегодня по-прежнему остается много хостингов, которые не разрешают включать WP-CLI и не дают SSH-доступ. Мы сталкивались с подобными клиентами. Также были случаи, когда подобные типы повторяющихся задач нужно было сделать простыми и понятными для клиента, а командная строка для этого подходит очень слабо.
По этой причине и был разработан Locomotive.
Что представляет собой Locomotive
Locomotive – это библиотека и плагин, позволяющие снизить сложность запросов и внести изменения в крупные наборы данных. Locomotive автоматически разбивает все запросы на ряд шагов, выполняя небольшие запросы по одному за раз и вызывая отдельные результаты через callback-функцию. В процессе функционирования библиотека также отслеживает и фиксирует ошибки, определяя обрабатываемые в данный момент объекты. Locomotive обеспечивает фундамент для простого создания и запуска произвольных скриптов массовой обработки.
Все, что вы зарегистрируете с помощью Locomotive, будет доступно в админке WordPress. Как только ваш запрос и действие будут настроены, вы сможете просто перейти в меню Locomotive и запустить свою задачу, щелкнув по кнопке. Библиотека может быть установлена на любой хостинг.
Как работает Locomotive
Чтобы использовать Locomotive, вам нужно будет зарегистрировать ваш процесс пакетной обработки, добавив функцию register_batch_process в файл functions.php вашей темы либо в отдельный функциональный плагин. Каждый процесс состоит из двух частей: ваш запрос и ваша callback-функция для полученных результатов.
При регистрации процесса вы задаете параметры вашего запроса, используя любые аргументы, доступные в стандартных запросах WordPress. Затем вы задаете простую функцию обратного вызова (callback). При выполнении запроса Locomotive проходит по массиву данных и помещает каждый отдельный объект в callback-функцию, где вы можете обработать его любым образом. Затем Locomotive разбивает обработку данных на отдельные шаги и выводит процесс обработки результатов в понятном для пользователя виде.
В данный момент Locomotive находится в ранней бета-версии. В ближайшие месяцы разработчики планируют протестировать разные варианты обработки и добавить другие возможности, отмеченные в дорожной карте.
Практический пример регистрации процесса с использованием Locomotive
Допустим, вы работаете с сайтом компании, на котором имеется более 10 тысяч постов. Раньше при пометке записи как «Classic» компания добавляла произвольное поле classic_post, значение которого равнялось true. Однако теперь разработчики приняли решение перестроить всю секцию этих записей, создав под них новую рубрику Classic. Возникла задача: как перенести все записи classic_post в новую рубрику?
Locomotive упрощает данную задачу.
Первый шаг – регистрируем процесс, используя хук locomotive_init и функцию register_batch_process, добавленную в плагин.
Давайте как-то назовем процесс. По этому названию впоследствии можно будет найти его в админке WordPress.
function register_my_batch_processes() { register_batch_process( 'name' => 'Convert Classic Posts', 'type' => '', 'args' => array(), 'callback' => '' ); } add_action( 'locomotive_init', 'register_my_batch_processes' );
Теперь нам нужно задать наш тип. Locomotive собирает данные, основываясь на существующих классах запросов WordPress. Каждый тип указывает на определенный класс запросов WP:
Класс WP | Тип |
---|---|
WP_Query | post |
WP_User_Query | user |
WP_Term_Query | term |
WP_Comment_Query | comment |
WP_Site_Query | site (только для мультисайтов) |
В данном случае нам понадобятся записи, поэтому в качестве типа зададим post.
function register_my_batch_processes() { register_batch_process( 'name' => 'Convert Classic Posts', 'type' => 'post', 'args' => array(), 'callback' => '' ); } add_action( 'locomotive_init', 'register_my_batch_processes' );
Args используется для передачи остальных параметров запроса с целью формирования требуемого набора данных. Любой параметр, работающий в WP_Query или в других сопутствующих классах запросов, будет работать и здесь. В нашем примере мы хотим получить все записи, которые имеют произвольное поле classic_post:
function register_my_batch_processes() { register_batch_process( 'name' => 'Convert Classic Posts', 'type' => 'post', 'args' => array( 'post_type' => 'post', 'post_status' => 'publish', 'meta_key' => 'classic_post' ), 'callback' => '' ); } add_action( 'locomotive_init', 'register_my_batch_processes' );
Очень просто. Locomotive получит все записи с соответствующим произвольным полем, после чего обработает их в функции обратного вызова. Не беспокойтесь по поводу пагинации – Locomotive поставляется с продуманными базовыми настройками для разбиения данных. Однако если вы хотите явно определить, сколько данных должно обрабатываться на каждом шаге, вы можете использовать аргумент posts_per_page.
Последний шаг – определение функции обратного вызова. Функции будет передан отдельный объект (в нашем случае пост). Нам нужно, чтобы функция добавляла запись в категорию Classic. Давайте создадим функцию и передадим ее имя в register_batch_process.
function register_my_batch_processes() { register_batch_process( 'name' => 'Convert Classic Posts', 'type' => 'post', 'args' => array( 'post_type' => 'post', 'post_status' => 'publish', 'meta_key' => 'classic_post' ), 'callback' => 'add_post_to_classic_category' ); } add_action( 'locomotive_init', 'register_my_batch_processes' ); function add_post_to_classic_category( $post_object ) { wp_set_object_terms( $post_object->ID, 'classic', 'category', true ); }
Теперь нам осталось только запустить процесс. Locomotive содержит список массовых процессов в меню Инструментов. Переходим в раздел Инструменты > Batches в админке WordPress. Там вы увидите список процессов, зарегистрированных вами. Чтобы выполнить любой из них, просто выберите его и нажмите «Run Batch».
В процессе выполнения процесса с каждым новым шагом прогресс-бар будет заполняться. Если по каким-либо причинам некоторые данные не были обработаны, вы увидите ошибку Status: Failed. В журнале ошибок можно будет посмотреть, какой объект вызвал данную ошибку, и в чем состоит суть ошибки.
Locomotive также умеет определять, были ли объекты уже обработаны ранее. Он будет автоматически пропускать их. Если вы хотите все сбросить и обработать ваши данные заново с нуля, вы можете выбрать массовый процесс и щелкнуть по кнопке «Reset Batch».