List the products needed to fulfill all pending orders in WooCommerce

Sometimes it’s easier to pick the day’s orders all at once. This snippet adds a new menu item under WooCommerce called Pending Order Summary that prints a list of all the products needed to complete all pending orders.

The plugin also has a helpful ‘Print’ button at the end of the list, which prints the list without any of the surrounding WordPress Dashboard.

function register_pending_order_summary_page() {
    add_submenu_page( 'woocommerce', 'Pending Order Summary', 'Pending Order Summary', 'read', 'pending_order_summary_page', 'pending_order_summary_page_callback' );
}
function pending_order_summary_page_callback() {  ?>

<div class="wrap">

  <h1>Pending Order Summary</h1>
  <p id="pendingordersubtitle">This is a list of all the products needed to complete all 'Processing' orders.<br /><hr /></p>

  <?php

    //Create an array to store order line items
    $output_stack = array();

    //Create an array to store order line item ids 
    $output_stack_ids = array();
    
    //Array to display the results in numerical order
    $output_diplay_array = array();
    
  //SQL code
  global $wpdb;
  $order_line_items;
    
  //Get the order ID of processing orders
  $order_ids = $wpdb->get_results( $wpdb->prepare("SELECT ID FROM {$wpdb->prefix}posts where post_type = %s and post_status = %s;", 'shop_order', 'wc-processing' ));

  //Collect the order IDs and add products to the pick list
  foreach($order_ids as $an_order_id) {

        //Collect all order line items matching IDs of pending orders
        $order_line_items = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}woocommerce_order_items where order_id = %d and order_item_type = %s;", $an_order_id->ID, 'line_item'));
        
       //Extract the order line item
        foreach($order_line_items as $line_item) {

           //Add it to the array
           $pair = array($line_item->order_item_name, $line_item->order_item_id);
              array_push($output_stack, $line_item->order_item_name); //Now we've got a list of line items
          array_push($output_stack_ids, $pair); //Now we've got a list of line ids

        }
    }

    //Count the number of occurances of each value
    $occurences = (array_count_values($output_stack));

    // Print output
    echo '<table><tr><td style="width: 100px;"><strong>Quantity</strong></td><td><strong>Product</strong></td></tr>';
    
    if(count($occurences)>0){
        
        $cumulative_count = 0;
        
        //Loop through each different product in our list
        foreach ($occurences as $product_name => $quantity) {
            
             //Go through the list of ALL line items from earlier 
            foreach($output_stack_ids as $the_line_item) {
               
                //We only want to cumulatively add the quantity if the line item name matches the current product name in the list of unique products
                if ($product_name == $the_line_item[0]) {
                    
                //Reset the quanitity to zero, because we don't need to know the number of instances if we're counting stock
                 $quantity = 0;
            
                //For each unique line item, we want to retrieve the quantity
                $order_line_item_quantity = $wpdb->get_results( $wpdb->prepare("SELECT meta_value FROM {$wpdb->prefix}woocommerce_order_itemmeta where meta_key = %s and order_item_id=%d", "_qty", $the_line_item[1]));

                 //We've now got the quantity for each line item. Add them all together.
                  foreach($order_line_item_quantity as $item_quantity) {
                      
                      //The total quantity is the combined _qty of each instance of a unique line item
                    $cumulative_count = $cumulative_count + ($item_quantity->meta_value );
                   
                  }
                 
                }
                  
            }
            
             $quantity = $cumulative_count;
             $cumulative_count = 0;
             
            $output_diplay_array[$product_name] = $quantity;
            arsort($output_diplay_array);
    }
     
     
     //Output the results in a table
     foreach ($output_diplay_array as $product_name => $quantity) {
          echo '<tr><td>' . $quantity . '</td><td>' . $product_name.'</td></tr>';
     }
     
     echo '</table>';
     
     //Some house cleaning
    $wpdb->flush();
    
    }

?>

<br /><a href="javascript:window.print()"><button type="button" class="orderprintbutton">Print</button>
     
</div>

<?php }
add_action('admin_menu', 'register_pending_order_summary_page',99); 

//Function to apply print styling to the page
add_action('admin_head', 'dashboard_print_view');

function dashboard_print_view() {
  echo '<style>
   @media print { 

    #adminmenu{display: none!important;} 
    div#adminmenuback {display: none!important;}
    #wpcontent {margin-left: 5%!important;}
    #wpfooter {display: none!important;}
    .orderprintbutton {display: none!important;"}
    #screen-meta {display: none!important;}
}
  </style>';
}

To install, add the above code to your theme’s functions.php file or to a MU Plugin. You can also use the Code Snippets plugin to install it, which is handy if you don’t have access to the filesystem.

Shane Gowland

Hi! I’m a web designer, software developer, and digital marketer based in South Australia. I've been building websites on WordPress for over 12 years. You can learn more about the projects and businesses I'm involved with on my website.

1 thought on “List the products needed to fulfill all pending orders in WooCommerce”

Leave a Reply