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”