Locomotive – новая библиотека массовой обработки данных в WordPress

Дата публикации:Февраль 11, 2017

Компания 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_Querypost
WP_User_Queryuser
WP_Term_Queryterm
WP_Comment_Querycomment
WP_Site_Querysite (только для мультисайтов)

В данном случае нам понадобятся записи, поэтому в качестве типа зададим 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».

Поделиться

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.