Групповые действия (bulk_actions) в таблицах: постов, страниц, юзеров, комментов…

Почти каждая таблица в админке WordPress позволяет массово редактировать элементы: записи, плагины, юзеров, комментарии и т.д. С версии WP 4.7 появились специальные хуки, чтобы добавлять в такие массовые действия свои собственные, и затем их обрабатывать. Такой функционал нам конечно пригодится, поэтому давайте его срочно разберем. Кроме того, делается это очень просто!

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

Нам понадобятся три хука, с помощью которых можно добавить «действие» в любую «родную таблицу WP» типа WP_List_Table :

Как узнать ID экрана (screen_id) смотрите в описании функции get_current_screen() или в описании хука current_screen.

Видео по теме:

Шаг 1. Добавление элемента (option) в выпадающий список

Нужно прикрепить функцию к динамическому фильтру bulk_actions-(screen_id), которая добавить наш новый элемент (option) в массив уже имеющихся действий.

(screen_id) нужно заменить на ID текущего экрана админки. На странице списка записей - это edit-post, поэтому хук будет выглядеть так:

add_filter( 'bulk_actions-'.'edit-post', 'register_my_bulk_actions' );
function register_my_bulk_actions( $bulk_actions ){
	$bulk_actions['my_action'] = 'Моё действие';

	return $bulk_actions;
}

Шаг 2. Перехват запроса и обработка (сабмит формы)

Используем хук-фильтр handle_bulk_actions-(screen_id). (screen_id) также нужно заменить на ID экрана.

При успешном выполнении операции, нужно вернуть измененный параметр $redirect_to. В нем нужно изменить URL, добавить параметр запроса, чтобы потом по нему вывести сообщение об успешном выполнении операции или об ошибке. Изменение параметра $redirect_to сигнализирует, что нужно перезагрузить страницу и определяет на какой URL нужно сделать перенаправление.

add_filter( 'handle_bulk_actions-'.'edit-post', 'my_bulk_action_handler', 10, 3 );
function my_bulk_action_handler( $redirect_to, $doaction, $post_ids ){
	// ничего не делаем если это не наше действие
	if( $doaction !== 'my_action' ){
		return $redirect_to;
	}

	foreach( $post_ids as $post_id ){
		// действие для каждого поста
	}

	$redirect_to = add_query_arg( 'my_bulk_action_done', count( $post_ids ), $redirect_to );

	return $redirect_to;
}

Последний параметр хука может отличаться, в зависимости от страницы на который мы добавляем массовое действие: у юзеров там будет ID выбранных юзеров, в комментах комменты... Подробнее смотрите в описании хука (ссылка выше).

Шаг 3. Показ сообщения

Чтобы пользователи видели что что-то произошло и что именно произошло: успешна ли операция или была ошибка, им нужно показать сообщение о результате операции.

Сделать это очень просто: проверяем наличие указанной в URL переменной и если она есть выводим нужное сообщение с помощью хука admin_notices.

add_action( 'admin_notices', 'my_bulk_action_admin_notice' );
function my_bulk_action_admin_notice(){
	if( empty( $_GET['my_bulk_action_done'] ) ){
		return;
	}

	$data = $_GET['my_bulk_action_done'];

	$msg = sprintf( 'Моё действие обработало записей: %d.', intval($data) );

	echo '<div id="message" class="updated"><p>'. $msg .'</p></div>';
}

-

На этом все. Успехов!