prefix . 'batch_operations'; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE $table_name ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `operations` longtext NOT NULL, PRIMARY KEY (`id`) ) $charset_collate AUTO_INCREMENT=1;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $sql ); } /** * Add backend page without menu item */ function batch_operations_add_page() { add_management_page( 'Batch operations', '', 'edit_posts', 'batch-operations', 'batch_operations_page_view' ); } /** * View batch operations page */ function batch_operations_page_view() { //WP 3.3 wp_enqueue_script( 'jquery' ); wp_enqueue_script( 'batch_operations_script', plugin_dir_url('') . 'batch-operations/js/batch.min.js' ); wp_enqueue_style( 'batch_operations_script', plugin_dir_url('') . 'batch-operations/css/batch.css' ); $id = ( intval( $_REQUEST["id"] ) < 0 )? 0 : intval( $_REQUEST["id"] ); ?>
 * $batch = array(
 *   'title' => t('Exporting'),
 *   'operations' => array(
 *     array('my_function_1', array(123, 'qwe')),
 *     array('my_function_2', array()),
 *   ),
 *   'finished' => 'my_finished_callback',
 * );
 *
 * batch_operations_start($batch);
 * 
 *
 * 
 * function my_function_1($id, $text, &$context) {
 *   $context['results'][] = $text . $id;
 *   $context['message'] = 'Text + id ='.$text . $id;
 * }
 *
 * The $context array gathers batch context information about the execution (read),
 *  as well as 'return values' for the current operation (write)
 *  The following keys are provided :
 * 'results' (read / write): The array of results gathered so far by
 *   the batch processing, for the current operation to append its own.
 * 'message' (write): A text message displayed in the progress page.
 * The following keys allow for multi-step operations :
 * 'sandbox' (read / write): An array that can be freely used to
 *   store persistent data between iterations. It is recommended to
 *   use this instead of $_SESSION, which is unsafe if the user
 *   continues browsing in a separate window while the batch is processing.
 * 'finished' (write): A float number between 0 and 1 informing
 *   the processing engine of the completion level for the operation.
 *   1 (or no value explicitly set) means the operation is finished
 *   and the batch processing can continue to the next operation.
 * 
 *
 * @param array $batch_arr array operations and more
 */
function batch_operations_start($batch_arr)
{
  global $wpdb;
  $batch_arr['context'] = array(
    'message'  => '',
    'sandbox'  => array(),
    'finished' => true,
    'results'  => array()
  );
  $batch_arr['count']   = count( $batch_arr['operations'] );
  $batch_arr['current'] = 0;
  $wpdb->insert(
    $wpdb->prefix . 'batch_operations',
    array(
      'operations' => serialize( $batch_arr )
    ),
    array(
      '%s'
    )
  );
  $location = get_admin_url(null, 'tools.php') . "?page=batch-operations&id=" . $wpdb->insert_id;
  if ( ! headers_sent() ) {
    wp_redirect( $location );
  } else {
    // if header is set then runs this hack
    echo '';
    echo '';
  }
  exit(0);
}