Почти каждая таблица в админке WordPress позволяет массово редактировать элементы: записи, плагины, юзеров, комментарии и т.д. С версии WP 4.7 появились специальные хуки, чтобы добавлять в такие массовые действия свои собственные, и затем их обрабатывать. Такой функционал нам конечно пригодится, поэтому давайте его срочно разберем. Кроме того, делается это очень просто!
Пройдемся по шагам, и на примере посмотрим, как добавлять свои групповые функции и их обработчики.
Нам понадобятся три хука, с помощью которыйхможно добавить «действие» в любую «родную таблицу WP» типа WP_List_Table :
Шаг 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( $_REQUEST'my_bulk_action_done' ) ) return; $data = $_REQUEST'my_bulk_action_done'; $msg = sprintf( 'Моё действие обработало записей: %d.', intval($data) ); echo '<div id="message" class="updated fade"><p>'. $msg .'</p></div>'; }
—
На этом все. Успехов!