Групповые действия (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>'; }
-
На этом все. Успехов!