29.03.2024

Свои групповые действия в таблице постов, страниц, юзеров, комментов…

Почти каждая таблица в админке 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>';
}

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

Добавить комментарий

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