Пользовательский bulk_action

Я хотел бы добавить настраиваемое массовое действие к настраиваемому типу сообщения. Я столкнулся с фильтром bulk_actions-screenid , который, согласно его документации , будет делать именно так, как я желаю . Однако после двух часов отладки я нашел следующий комментарий // This filter can currently only be used to remove actions. на строке 278 класса-wp-list-table.php – отлично!

Я решил, что могу взломать его, используя jQuery, чтобы ввести действие в качестве опции

 /** * Hack to add a custom bulk action. */ public function admin_footer() { if($_GET['post_type'] != self::POST_TYPE) return; ?> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']"); }); </script> <?php } 

Это работает. Действие теперь появляется в меню групповых действий. Я был в предположении, что тогда я мог бы добавить некоторую логику в admin_init для выполнения необходимой обработки – однако, похоже, что create_invoice никогда не публикуется. Есть ли что-то, что я делаю неправильно?

=== UPDATE ===

Я обновил код, чтобы использовать load-* hook. Когда я применяю массовое действие на users.php – я вижу, create_invoice через запрос передается create_invoice . Однако на edit.php create_invoice никогда не печатается.

 function a39x2_admin_footer() { ?> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action']"); jQuery('<option>').val('create_invoice').text('Bill').appendTo("select[name='action2']"); }); </script> <?php } add_action('admin_footer', 'a39x2_admin_footer'); function a39x2_load() { echo "<pre>" . print_r($_REQUEST, true) . "</pre>"; } add_action('load-edit.php', 'a39x2_load'); add_action('load-users.php', 'a39x2_load'); 

Solutions Collecting From Web of "Пользовательский bulk_action"

Я думаю, что последний крупный выпуск требует нового ответа на этот вопрос, учитывая популярность этого вопроса.

Поскольку WordPress 4.7 (выпущен в декабре 2016 г.), можно добавлять собственные массовые действия без использования JavaScript.

Фильтр bulk_actions-{$screen} (например, bulk_actions-edit-page для обзора страниц) теперь позволяет добавлять пользовательские массовые действия. Кроме того, новое действие, называемое handle_bulk_actions-{$screen} (например, handle_bulk_actions-edit-page ), позволяет обрабатывать выполнение действия.

Это все объясняется довольно хорошо в этом сообщении в блоге . Например, предположим, что мы хотим добавить массовое действие для отправки заголовков выбранных элементов в обзор страниц. Мы могли бы сделать это следующим образом:

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

Добавление массового действия в раскрывающийся список:

 function wpse29822_page_bulk_actions( $actions ) { // Add custom bulk action $actions['my-action-handle'] = __( 'My Custom Bulk Action' ); return $actions; } add_action( 'bulk_actions-edit-page', 'wpse29822_page_bulk_actions' ); 

Добавление обработчика для массового действия:

 function wpse29822_page_bulk_actions_handle( $redirect_to, $doaction, $post_ids ) { // Check whether action that user wants to perform is our custom action if ( $doaction == 'my-action-handle' ) { // Do stuff } return $redirect_to; } add_action( 'handle_bulk_actions-edit-page', 'wpse29822_page_bulk_actions_handle', 10, 3 ); 

bulk_actions-* не позволяет вам добавлять настраиваемые bulk_actions-* действия именно потому, что сложнее добавить обработчик для этого действия. Обновлен Codex.

Я бы предложил использовать load-* action вместо admin_init . Обратите внимание, что вам необходимо выполнить все проверки безопасности, такие как check_ajax_referrer () и current_user_can ().