A few months back I added some new order statuses in WooCommerce, then changed the code to be able to use these from the bulk actions menu. I then added them into the dashboard so I could get a quick overview of what I needed to do each day.
This was just a quick (maybe not so quick) edit of the admin files. A while later I update WooCommerce and bang goes my edits (yes I can hear everyone shouting ‘should have made a child theme’). I did actually have a child theme running, but it was just a quick dirty way of getting it done at the time. I needed to concentrate on orders.
Anyway back to now, we’ve had a few thousand orders in a short space of time and once again I need my custom statuses from the bulk menu. This time I decided to do it right.
After searching and searching, I couldn’t find anyone saying how to add to the bulk menu, plenty of stuff about adding a status but you have to then edit each order to use it. Knowing I’ve done it before and didn’t take half the day doing so I kept searching. Eventually I found http://www.niepes.com/web/how-to-create-a-custom-order-status-in-woocommerce/ and this is exactly what I needed.
Well sort of. I didn’t want the email side of it and actually wanted to add a few customs (2 atm) . So I changed the code a little.
Find below the code I have now added to functions.php (note I already created the custom statuses of ‘printing’ and ‘stock’ using WooCommerce Jetpack.
//added for woocommerce bulk actions. add_action('admin_footer-edit.php', 'custom_bulk_admin_footer'); function custom_bulk_admin_footer() { global $post_type; if($post_type == 'shop_order') { ?> <script type="text/javascript"> jQuery(document).ready(function() { //printing status jQuery('<option>').val('printing').text('<?php _e('Mark as Printing')?>').appendTo("select[name='action']"); jQuery('<option>').val('printing').text('<?php _e('Mark as Printing')?>').appendTo("select[name='action2']");
//stock status jQuery('<option>').val('stock').text('<?php _e('Mark as Awaiting Stock')?>').appendTo("select[name='action']"); jQuery('<option>').val('stock').text('<?php _e('Mark as Awaiting Stock')?>').appendTo("select[name='action2']"); }); </script> <?php } }
add_action('load-edit.php', 'custom_bulk_action'); function custom_bulk_action() { global $typenow; $post_type = $typenow;
if($post_type == 'shop_order') { $wp_list_table = _get_list_table('WP_Posts_List_Table'); $action = $wp_list_table->current_action(); $allowed_actions = array("stock","printing"); if(!in_array($action, $allowed_actions)) return;
if(isset($_REQUEST['post'])) { $orderids = array_map('intval', $_REQUEST['post']); }
switch($action) { case "printing": foreach( $orderids as $orderis ) { change_order_status($orderid, $action); } case "stock": foreach( $orderids as $orderid ) { change_order_status($orderid, $action); } break; default: return; }
$sendback = admin_url( "edit.php?post_type=$post_type&success=1" ); wp_redirect($sendback); exit(); } }
function change_order_status($orderid, $action) { $order = new WC_Order($orderid); if(($action=='printing') && ($order->status!='printing')) { $order->update_status('printing', ''); } if(($action=='stock') && ($order->status!='stock')) { $order->update_status('stock', ''); } }
add_action('admin_notices', 'custom_bulk_admin_notices'); function custom_bulk_admin_notices() { global $post_type, $pagenow; if( $post_type == 'shop_order' && isset($_GET['success']) ) { echo '<div class="updated"><p>The orders have been successfully update!</p></div>'; } }
One thought on “WooCommerce New Bulk Action”