Bulk action hook for admin pages which uses WP_List_Table
-
03-10-2020 - |
Вопрос
I have an admin page which I added using add_submenu_page function which is listing some custom data using WP_List_Table class. I have defined the bulk actions options in get_bulk_actions and it appears in dropdown. But which is the hook that will be triggered when user submits the form.
I tried following but no luck
add_action( 'admin_action_YOUR_ACTION', 'your_bulk_action_handler_function' );
Now in order to make it work I defined a hook function in 'admin_init' and am checking
if(isset($_POST['action']) && $_POST['action'] == 'export_action' )
{
//Export code here.
}
But is there a better way of doing it?
Решение
You have to use "process_bulk_action" function like this:
public function process_bulk_action() {
//nonce validations,etc
$action = $this->current_action();
switch ( $action ) {
case 'export_action':
// Do whatever you want
wp_redirect( esc_url( add_query_arg() ) );
break;
default:
// do nothing or something else
return;
break;
}
return;
}
}
If you need a complete example this is the code I'm using for a plugin:
public function process_bulk_action() {
if ( isset( $_POST['_wpnonce'] ) && ! empty( $_POST['_wpnonce'] ) ) {
echo '<pre>';
print_r($_POST);
echo '</pre>';
$nonce = filter_input( INPUT_POST, '_wpnonce', FILTER_SANITIZE_STRING );
$action = 'bulk-' . $this->_args['plural'];
if ( ! wp_verify_nonce( $nonce, $action ) )
wp_die( 'Nope! Security check failed!' );
}
$action = $this->current_action();
switch ( $action ) {
case 'delete':
self::delete_activity( absint( $_GET['activity'] ) );
wp_redirect( esc_url( add_query_arg() ) );
break;
case 'bulk-delete':
$ids = esc_sql( $_POST['bulk-selected'] );
foreach ( $ids as $id ) {
self::delete_activity( $id );
}
wp_redirect( esc_url( add_query_arg() ) );
break;
case 'bulk-export':
$ids = esc_sql( $_POST['bulk-selected'] );
self::export_activities( $ids );
wp_redirect( esc_url( add_query_arg() ) );
break;
default:
// do nothing or something else
return;
break;
}
return;
}
I hope this helps you ;)