Shipping classes are used to group similar products together to provide different flat-rate shipping costs to each group. In a recent project, we grouped about a thousand products into three shipping classes; 500g satchel, 1kg satchel, or bulky parcel.
The size of the inventory practically guaranteed that a few products would be missed. When we compared the number of products in each shipping class with the total size of the inventory, it was immediately obvious that a few dozen products hadn’t been assigned a shipping class, but WooCommerce provided no immediately obvious way of identifying them.
This little plugin was put together to quickly generate a list of all published products that don’t have a shipping class assigned.
Installation is easy: Just save the below code to a .php file and upload it to /wp-content/mu-plugins/, then No Shipping Class should appear under Products in the WordPress dashboard. Check out ‘How to create a must use plugin‘ if you run into trouble.
<?php
/**
* Plugin Name: Find Products Without Shipping Class
* Description: Adds a page that lists all products without a shipping class
* Author: Shane Gowland
* License: GPL
* License URI: https://gowland.me
*/
function register_shipping_class_checker_page() {
add_submenu_page( 'edit.php?post_type=product', 'Missing Shipping Classes', 'No Shipping Class', 'manage_options', 'missing_shipping_classes_page', 'missing_shipping_classes_page_callback' );
}
function missing_shipping_classes_page_callback() { ?>
<div class="wrap">
<h1>Missing Shipping Classes</h1>
<p>The products listed below do not have a Shipping Class assigned.</p>
<?php
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish'
);
$loop = new WP_Query( $args );
global $post;
global $product;
//Count how many products were found so we can give zero-results feedback
$products_found = 0;
while ( $loop->have_posts() ) : $loop->the_post();
$_product = wc_get_product($post->ID);
$shipclass = $_product->get_shipping_class();
//Output the product
if (strlen($shipclass) == 0) {
echo '<br /> '.get_the_title(). ' — <a target="_blank" href="' . get_edit_post_link($post->ID) . '">Edit Product</a>';
$products_found++;
}
endwhile;
wp_reset_query();
//Output something if the number of results is zero
if ($products_found == 0) {
echo "No products were found.";
}
?>
</div>
<?php }
add_action('admin_menu', 'register_shipping_class_checker_page',99);
Once all of the products have been identified and corrected, you can remove the plugin — or just leave it installed for next time.
Hello im use this awesome code script in my website and its working just fine! i wanted to ask if this can be used to get products that does not have weight? thank you in advance
Yes, absolutely.
Hello!
I placed your code directly into the Snippets plugin instead of creating an extra plugin, and it works flawlessly. In 1500 products, I knew I had exactly 4 products without shipping class (how is that come, I don’t know, I’ve set all the products inside that categeory already).
Now I can keep an eye on that.
Many thanks!
Cheers
Thanks so much for this. Also found it worked for me by placing in Snippets. It’s a huge time saver, thank you.