Skip to content

Instantly share code, notes, and snippets.

@mikejolley
Created November 4, 2011 12:45
Show Gist options
  • 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>
@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