Skip to content

Instantly share code, notes, and snippets.

@mikejolley
Created November 4, 2011 12:45
Show Gist options
  • Star 29 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save mikejolley/1339240 to your computer and use it in GitHub Desktop.
Save mikejolley/1339240 to your computer and use it in GitHub Desktop.
WooCommerce - Print Processing orders. A template page snippet to (if you are logged in as admin) output all of your orders with 'processing' status (paid) ready for printing.
<?php
/*
Template Name: Print Processing Orders :)
*/
if (!is_user_logged_in() || !current_user_can('manage_options')) wp_die('This page is private.');
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title><?php _e('Processing Orders'); ?></title>
<style>
body { background:white; color:black; width: 95%; margin: 0 auto; }
table { border: 1px solid #000; width: 100%; }
table td, table th { border: 1px solid #000; padding: 6px; }
article { border-top: 2px dashed #000; padding: 20px 0; }
</style>
</head>
<body>
<header>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h1 class="title"><?php the_title(); ?></h1>
<?php the_content(); ?>
<?php endwhile; endif; ?>
</header>
<section>
<?php
global $woocommerce;
$args = array(
'post_type' => 'shop_order',
'post_status' => 'publish',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'shop_order_status',
'field' => 'slug',
'terms' => array('processing')
)
)
);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$order_id = $loop->post->ID;
$order = new WC_Order($order_id);
?>
<article>
<header>
<h2>Order #<?php echo $order_id; ?> &mdash; <time datetime="<?php the_time('c'); ?>"><?php echo the_time('d/m/Y'); ?></time></h2>
</header>
<table cellspacing="0" cellpadding="2">
<thead>
<tr>
<th scope="col" style="text-align:left;"><?php _e('Product', 'woothemes'); ?></th>
<th scope="col" style="text-align:left;"><?php _e('Quantity', 'woothemes'); ?></th>
<th scope="col" style="text-align:left;"><?php _e('Price', 'woothemes'); ?></th>
</tr>
</thead>
<tfoot>
<tr>
<th scope="row" colspan="2" style="text-align:left; padding-top: 12px;"><?php _e('Subtotal:', 'woothemes'); ?></th>
<td style="text-align:left; padding-top: 12px;"><?php echo $order->get_subtotal_to_display(); ?></td>
</tr>
<?php if ($order->order_shipping > 0) : ?><tr>
<th scope="row" colspan="2" style="text-align:left;"><?php _e('Shipping:', 'woothemes'); ?></th>
<td style="text-align:left;"><?php echo $order->get_shipping_to_display(); ?></td>
</tr><?php endif; ?>
<?php if ($order->order_discount > 0) : ?><tr>
<th scope="row" colspan="2" style="text-align:left;"><?php _e('Discount:', 'woothemes'); ?></th>
<td style="text-align:left;"><?php echo woocommerce_price($order->order_discount); ?></td>
</tr><?php endif; ?>
<?php if ($order->get_total_tax() > 0) : ?><tr>
<th scope="row" colspan="2" style="text-align:left;"><?php _e('Tax:', 'woothemes'); ?></th>
<td style="text-align:left;"><?php echo woocommerce_price($order->get_total_tax()); ?></td>
</tr><?php endif; ?>
<tr>
<th scope="row" colspan="2" style="text-align:left;"><?php _e('Total:', 'woothemes'); ?></th>
<td style="text-align:left;"><?php echo woocommerce_price($order->order_total); ?> <?php _e('- via', 'woothemes'); ?> <?php echo ucwords($order->payment_method); ?></td>
</tr>
</tfoot>
<tbody>
<?php echo $order->email_order_items_table(); ?>
</tbody>
</table>
<h2><?php _e('Customer details', 'woothemes'); ?></h2>
<?php if ($order->billing_email) : ?>
<p><strong><?php _e('Email:', 'woothemes'); ?></strong> <?php echo $order->billing_email; ?></p>
<?php endif; ?>
<?php if ($order->billing_phone) : ?>
<p><strong><?php _e('Tel:', 'woothemes'); ?></strong> <?php echo $order->billing_phone; ?></p>
<?php endif; ?>
<div style="float:left; width: 49%;">
<h3><?php _e('Billing address', 'woothemes'); ?></h3>
<p>
<?php echo $order->get_formatted_billing_address(); ?>
</p>
</div>
<div style="float:right; width: 49%;">
<h3><?php _e('Shipping address', 'woothemes'); ?></h3>
<p>
<?php echo $order->get_formatted_shipping_address(); ?>
</p>
</div>
<div style="clear:both;"></div>
</article>
<?php endwhile; ?>
</section>
</body>
</html>
@mikeve
Copy link

mikeve commented Oct 1, 2013

Hi

This looks like exactly what I want, but I can't get it to work. I get the title but then a blank page.

I downloaded the php file and put in my themes directory and the created a page using the new template - nada.

What am I doing wrong?

Thanks

Mike

@mikeve
Copy link

mikeve commented Oct 2, 2013

Never mind!

I found out that I didn't have any orders with the status of processing. Doh!

Mike

@emirir
Copy link

emirir commented Feb 25, 2014

hi

how i can print "order comments" with this form?

@lonchbox
Copy link

Thanx a lot for this code :)

If you put this code in the functions.php to add a link to that page in the adminbar, I think is very useful too.

function mytheme_admin_bar_render() {
    global $wp_admin_bar;
    // we can add a submenu item too
    $wp_admin_bar->add_menu( array(
        'id' => 'print_orders',
        'title' => __('Print Orders'),
        'href' => get_bloginfo('url').'/processing-orders/',
        'meta'  => array(
            //'title' => __('Print Orders'),
            'target' => '_blank',
            'class' => 'woo_print_orders'
        ),
    ) );
}
// and we hook our function via, just for admin use role
if( current_user_can('administrator') ) {
    add_action( 'wp_before_admin_bar_render', mytheme_admin_bar_render' );
}

The href locate the page URL, I use that slug for the page but if you use a different one just change the URL.

@pipoulito
Copy link

hi , this is great !
but how can i do to have this only for a specific customer ID ?
thanks

@nortwin
Copy link

nortwin commented Nov 11, 2014

Hi...thanks a lot for this, it works great. Would it be possible to output the list as products instead of as orders??? any help would be much appreciated...

thanks

@spiderflystudios
Copy link

Is there a way to mod this to show only those of other statuses? For instance, I tried to change the array from "processing" to "complete"...and it showed all the ones processing too. Seems like this code, as is, only works correctly with the processing status.

Someone should turn this into a full plugin that will work with any of the stock or custom statuses. Would be an immense help.

@agentben96
Copy link

How can I make this display custom meta info for products on it? I know the meta fields names, but I don't know how to make them display for that order. Also it needs to divide the total for a product if there is more than 1 QTY. For example, it says QTY 2 = $114

It will need to also show (per piece price) which would be $57
And the Item (SKU) Number needs to be displayed.

A lot I know, But I will be very grateful if someone could help me with this.

@r9tee
Copy link

r9tee commented Mar 12, 2015

This is very cool Mike. Thanks for creating this.

I am hopeful that you or someone else could tell me how to make the page show all orders for a specific product and also, make it easy for someone to query different products via id or name on the page and have it generate the report.

Thanks again!

@nikicampbell
Copy link

It there a way of making it print from just a specific category? Or actually instead I would want to exclude two specific product categories :)

thanks in advance!
Niki

@scottmcculloch
Copy link

Hey @nikicampbell,

Did you ever figure out how to print from just a specific category (or to exclude categories)? That's exactly what I'm looking for and haven't been able to get it to work. I found this:
http://wpquestions.com/question/showChrono/id/8301

But it doesn't work. :(

Thanks,
Scott

@duncang17
Copy link

Hello handy code, thanks,

Is there a simple way of printing a list of just the marked orders (i.e. ones which have been manually checked in the checkbox on the admin orders page)?
All I really require is a simple printed list of the checked orders, with order numbers and order total, plus total of the totals .

Any plugins to achieve this?

Cheers Duncan

@Vernsloth
Copy link

@nikicampbell & @scottmcculloch

This is not fast or a great way to iterate through the categories but this will print after a slower loading time:

'shop_order', 'post_status' => 'publish', 'orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => 'shop_order_status', 'field' => 'slug', 'terms' => array( 'processing'), ), ``` ), ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); //echo '
' . print_r($post, true) . '
'; $order_id = $loop->post->ID; $order = new WC_Order($order_id); $items = $order->get_items(); foreach ($items as $key => $value) { $id = $value['product_id']; $terms = get_the_terms( $id, 'product_cat' ); //echo '
' . print_r($terms, true) . '
'; foreach ($terms as $term) { if( $term->slug == 'YOUR-PRODUCT-CATEGORY-SLUG' ){ $product-category = true; break 2; } else { //echo 'NO' . '
'; } } } if ($product-category ) : ?>
           <article>
    <header>
        <h2>Order #<?php echo $order_id; ?> &mdash; <time datetime="<?php the_time('c'); ?>"><?php echo the_time('M - d/Y'); ?></time></h2>
    </header>
    <table cellspacing="0" cellpadding="2">
        <thead>
            <tr>
                <th scope="col" style="text-align:left;"><?php _e('Product', 'woothemes'); ?></th>
                <th scope="col" style="text-align:left;"><?php _e('Quantity', 'woothemes'); ?></th>
                <th scope="col" style="text-align:left;"><?php _e('Price', 'woothemes'); ?></th>
            </tr>
        </thead>
        <tfoot> 
            <tr>
                <th scope="row" colspan="2" style="text-align:left; padding-top: 12px;"><?php _e('Subtotal:', 'woothemes'); ?></th>
                <td style="text-align:left; padding-top: 12px;"><?php echo $order->get_subtotal_to_display(); ?></td>
            </tr>
            <?php if ($order->order_shipping > 0) : ?><tr>
                <th scope="row" colspan="2" style="text-align:left;"><?php _e('Shipping:', 'woothemes'); ?></th>
                <td style="text-align:left;"><?php echo $order->get_shipping_to_display(); ?></td>
            </tr><?php endif; ?>
            <?php if ($order->order_discount > 0) : ?><tr>
                <th scope="row" colspan="2" style="text-align:left;"><?php _e('Discount:', 'woothemes'); ?></th>
                <td style="text-align:left;"><?php echo woocommerce_price($order->order_discount); ?></td>
            </tr><?php endif; ?>
            <?php if ($order->get_total_tax() > 0) : ?><tr>
                <th scope="row" colspan="2" style="text-align:left;"><?php _e('Tax:', 'woothemes'); ?></th>
                <td style="text-align:left;"><?php echo woocommerce_price($order->get_total_tax()); ?></td>
            </tr><?php endif; ?>
            <tr>
                <th scope="row" colspan="2" style="text-align:left;"><?php _e('Total:', 'woothemes'); ?></th>
                <td style="text-align:left;"><?php echo woocommerce_price($order->order_total); ?> <?php _e('- via', 'woothemes'); ?> <?php echo ucwords($order->payment_method); ?></td>
            </tr>
        </tfoot>
        <tbody>
            <?php echo $order->email_order_items_table(); ?>
        </tbody>
    </table>
         </article>

  <?php else : ?>

<?php endwhile; ?>

@xyzcardiff
Copy link

xyzcardiff commented Apr 15, 2017

After updating to woocommerce 3.03, this is now broken :(

It needs to be updated according to the new CRUD classes.

I have no idea how to do this :( Can anyone assist?

Thanks

@jnasevich
Copy link

The original code set $args for WP_Query() call using the following code:
$args = array( 'post_type' => 'shop_order', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => 'shop_order_status', 'field' => 'slug', 'terms' => array('processing') ) ) );

However, after upgrading WooCommerce to version 3.0.4, if you look in database in wp_posts table, you will notice that WooCommerce has added a "wc-" prefix to the values of the post_status field. So the values in the post_status field are now, for example:

  • wc-cancelled
  • wc-completed
  • wc-refunded
  • wc-processing

In addition, the taxonomy query (tax_query) no longer appears to be necessary, at least for my purposes. WooCommerce documentation still lists shop_order_status as a valid taxonomy, but my query no longer works when I include it.

So my revised $args statement looks like the following:
$args = array( 'post_type' => 'shop_order', 'post_status' => 'wc-processing', 'posts_per_page' => -1 );

Hope this helps!

@dschiffner
Copy link

@jnasevich - thanks for catching that! I was pulling my hair out for two days. Can't believe I looked over something so simple :P

@rughooker
Copy link

I still cannot get this to work. Can someone post the entire revised code. I must be missing something simple. I'm not a coder, so what may be obvious to a coder, is slipping right past me.

@Antoinebr
Copy link

Woocommerce changed

This works

global $woocommerce;
	
	$args = array(
		'post_type'			=> 'shop_order',
		'post_status' 		=> 'wc-processing',
    'posts_per_page' => -1,
	);
	
	$loop = new WP_Query( $args );
	
  if($loop->have_posts()) :
	while ( $loop->have_posts() ) : $loop->the_post();
	
		$order_id = $loop->post->ID;
		
		$order = new WC_Order($order_id);
		
    echo $order->get_formatted_billing_address();
      
    echo $order->get_formatted_shipping_address();

  endwhile;
	
  else :

    echo "Nothing found";

  endif;

@anji-sandage
Copy link

Does anyone have a working copy of this page template? I am trying to get it to work with the current version of woocommerce. Thanks!

@peterpenguw
Copy link

this is a core shopify feature that comes easily to shopify users. At version 4.0.0 it's still not integrated with WooCommerce? Sad

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment