So I am trying to get a custom bulk action to work in Wordpress 3.7.1 and so far no luck. The basis I am using is http://www.skyverge.com/blog/add-custom-bulk-action, and it goes wrong here: $wp_list_table = _get_list_table('WP_Posts_List_Table'); $action = $wp_list_table->current_action(); The action itself is added with jQuery and does show. When I use a prompt to show the `$action` value it is always empty, which means the rest of the script does not fire. Any idea here? The entire code: <?php /* Plugin Name: FoxRunSoftware Custom Bulk Action Demo Plugin URI: http://www.foxrunsoftware.net/articles/wordpress/add-custom-bulk-action/ Description: A working demonstration of a custom bulk action Author: Justin Stern Author URI: http://www.foxrunsoftware.net Version: 0.1 Copyright: © 2012 Justin Stern (email : [email protected]) License: GNU General Public License v3.0 License URI: http://www.gnu.org/licenses/gpl-3.0.html */ if (!class_exists('FRS_Custom_Bulk_Action')) { class FRS_Custom_Bulk_Action { public function __construct() { if(is_admin()) { // admin actions/filters add_action('admin_footer-edit.php', array(&$this, 'custom_bulk_admin_footer')); add_action('load-edit.php', array(&$this, 'custom_bulk_action')); add_action('admin_notices', array(&$this, 'custom_bulk_admin_notices')); } } /** * Step 1: add the custom Bulk Action to the select menus */ function custom_bulk_admin_footer() { global $post_type; if($post_type == 'post') { ?> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('<option>').val('export').text('<?php _e('Export')?>').appendTo("select[name='action']"); jQuery('<option>').val('export').text('<?php _e('Export')?>').appendTo("select[name='action2']"); }); </script> <?php } } /** * Step 2: handle the custom Bulk Action * * Based on the post http://wordpress.stackexchange.com/questions/29822/custom-bulk-action */ function custom_bulk_action() { global $typenow; $post_type = $typenow; if($post_type == 'post') { // get the action $wp_list_table = _get_list_table('WP_Posts_List_Table'); // depending on your resource type this could be WP_Users_List_Table, WP_Comments_List_Table, etc $action = $wp_list_table->current_action(); $allowed_actions = array("export"); if(!in_array($action, $allowed_actions)) return; // security check check_admin_referer('bulk-posts'); // make sure ids are submitted. depending on the resource type, this may be 'media' or 'ids' if(isset($_REQUEST['post'])) { $post_ids = array_map('intval', $_REQUEST['post']); } if(empty($post_ids)) return; // this is based on wp-admin/edit.php $sendback = remove_query_arg( array('exported', 'untrashed', 'deleted', 'ids'), wp_get_referer() ); if ( ! $sendback ) $sendback = admin_url( "edit.php?post_type=$post_type" ); $pagenum = $wp_list_table->get_pagenum(); $sendback = add_query_arg( 'paged', $pagenum, $sendback ); switch($action) { case 'export': // if we set up user permissions/capabilities, the code might look like: //if ( !current_user_can($post_type_object->cap->export_post, $post_id) ) // wp_die( __('You are not allowed to export this post.') ); $exported = 0; foreach( $post_ids as $post_id ) { if ( !$this->perform_export($post_id) ) wp_die( __('Error exporting post.') ); $exported++; } $sendback = add_query_arg( array('exported' => $exported, 'ids' => join(',', $post_ids) ), $sendback ); break; default: return; } $sendback = remove_query_arg( array('action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status', 'post', 'bulk_edit', 'post_view'), $sendback ); wp_redirect($sendback); exit(); } } /** * Step 3: display an admin notice on the Posts page after exporting */ function custom_bulk_admin_notices() { global $post_type, $pagenow; if($pagenow == 'edit.php' && $post_type == 'post' && isset($_REQUEST['exported']) && (int) $_REQUEST['exported']) { $message = sprintf( _n( 'Post exported.', '%s posts exported.', $_REQUEST['exported'] ), number_format_i18n( $_REQUEST['exported'] ) ); echo "<div class=\"updated\"><p>{$message}</p></div>"; } } function perform_export($post_id) { // do whatever work needs to be done return true; } } } new FRS_Custom_Bulk_Action();