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.

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

Leave a Reply