diff --git a/bath.php b/bath.php new file mode 100644 index 0000000..9617a50 --- /dev/null +++ b/bath.php @@ -0,0 +1,226 @@ +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', + * ); + * + * BatchController::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); +} \ No newline at end of file diff --git a/css/ShortCSS b/css/ShortCSS new file mode 160000 index 0000000..c87f617 --- /dev/null +++ b/css/ShortCSS @@ -0,0 +1 @@ +Subproject commit c87f6175bc7af40bce6f62d0ae1855f5149fdaf6 diff --git a/css/batch.css b/css/batch.css new file mode 100644 index 0000000..8b05534 --- /dev/null +++ b/css/batch.css @@ -0,0 +1 @@ +.batch-progress{height:30px;position:relative;background:#fff;-webkit-border-radius:8px;-moz-border-radius:8px;-o-border-radius:8px;-ms-border-radius:8px;-khtml-border-radius:8px;border-radius:8px;border:1px solid #ccc;margin:10px 0;padding:2px}.batch-progress>span{display:block;height:100%;background-color:#1834ff;background-image:-moz-linear-gradient(#4d80ff,#002ffb);background-image:-webkit-linear-gradient(#4d80ff,#002ffb);background-image:-o-linear-gradient(#4d80ff,#002ffb);background-image:-ms-linear-gradient(#4d80ff,#002ffb);background-image:linear-gradient(#4d80ff,#002ffb);-webkit-border-radius:6px;-moz-border-radius:6px;-o-border-radius:6px;-ms-border-radius:6px;-khtml-border-radius:6px;border-radius:6px;position:relative;overflow:hidden} \ No newline at end of file diff --git a/css/batch.styl b/css/batch.styl new file mode 100644 index 0000000..27f5c66 --- /dev/null +++ b/css/batch.styl @@ -0,0 +1,19 @@ +@import "ShortCSS/ShortCSS" + +.batch-progress + -h 30px + -pos relative + -bg #fff + b-radius 8px + -br 1px solid #ccc + -m 10px 0 + -p 2px + & > span + -d block + -h 100% + -bgc #1834ff + l-gradient #4d80ff, #002ffb + b-radius 6px + -pos relative + overflow hidden + diff --git a/js/batch.js b/js/batch.js new file mode 100644 index 0000000..0a6fdf2 --- /dev/null +++ b/js/batch.js @@ -0,0 +1,32 @@ +jQuery(document).ready(function($) { + var batch_progress = function (percent){ + return $(".batch-progress > span").animate({ width: percent + "%" }, 600); + }; + + function batch_process(){ + $.post( + ajaxurl+'?action=batch_operations&id='+batch_id, + function(data){ + if (data['do']=='finish') + { + + batch_progress(data['percent']); + $('.batch-message').html(data['message']).delay(1500).queue(function () { + $(location).attr('href',successful_page); + $(this).dequeue(); + } + ); + } + else + { + $('.batch-message').html(data['message']); + batch_progress(data['percent']); + batch_process() + } + } + ); + } + + batch_process(); + +}); \ No newline at end of file diff --git a/js/batch.min.js b/js/batch.min.js new file mode 100644 index 0000000..5abfcd4 --- /dev/null +++ b/js/batch.min.js @@ -0,0 +1 @@ +jQuery(document).ready(function(a){function b(){a.post(ajaxurl+"?action=batch_operations&id="+batch_id,function(d){"finish"==d["do"]?(c(d.percent),a(".batch-message").html(d.message).delay(1500).queue(function(){a(location).attr("href",successful_page),a(this).dequeue()})):(a(".batch-message").html(d.message),c(d.percent),b())})}var c=function(b){return a(".batch-progress > span").animate({width:b+"%"},600)};b()}); \ No newline at end of file diff --git a/readme.txt b/readme.txt index 5977b2b..39ff491 100644 --- a/readme.txt +++ b/readme.txt @@ -1,5 +1,5 @@ === Batch operations === -Contributors: Igor V Belousov +Contributors: igor-v-belousov Tags: batch Requires at least: 3.3 Tested up to: 3.3