When questions such as “How do you save the product stock inventory history?” pop up in our private Bloomer Armada slack channel for WooCommerce developers, I can’t really do without thinking of coding it myself!
This neat customization saves the stock quantity of a simple product or a variable product variation before there is a stock change, due to a manual stock quantity edit or a customer order.
Please bear in mind that if you have hundreds of stock movements per product this may slow down your backend and/or database, so the snippet may need some sort of optimization or limitation (“last 10 movements”).
So, let’s see how it works. Enjoy!
PHP Snippet: Display Stock Inventory Movements @ Product Edit Page
/**
* @snippet Save & Show Product Stock History
* @how-to Get tutoraspire.com FREE
* @author Tutor Aspire
* @testedwith WooCommerce 7
* @donate $9 https://tutoraspire.com
*/
add_action( 'woocommerce_product_before_set_stock', 'tutoraspire_historical_stock_product_parent' );
add_action( 'woocommerce_variation_before_set_stock', 'tutoraspire_historical_stock_product_parent' );
function tutoraspire_historical_stock_product_parent( $product ) {
$stock_history = get_post_meta( $product->get_id(), '_stock_history', true ) ? get_post_meta( $product->get_id(), '_stock_history', true ) : array();
$stock_history[time()] = (int)get_post_meta( $product->get_id(), '_stock', true );
update_post_meta( $product->get_id(), '_stock_history', $stock_history );
}
add_action( 'add_meta_boxes', 'tutoraspire_product_meta_box' );
function tutoraspire_product_meta_box() {
add_meta_box( 'stock_history', 'Stock History', 'tutoraspire_display_stock_history', 'product', 'advanced', 'high' );
}
function tutoraspire_display_stock_history() {
global $post;
$product = wc_get_product( $post->ID );
if ( $product->get_type() == 'variable' ) {
foreach ( $product->get_available_variations() as $key ) {
$products[] = $key['variation_id'];
}
} else $products[] = $post->ID;
foreach ( $products as $product_id ) {
$product = wc_get_product( $product_id );
echo '' . $product->get_name() . '
';
$stock_history = get_post_meta( $product_id, '_stock_history', true );
if ( $stock_history ) {
foreach ( $stock_history as $timestamp => $stockvalue ) {
if ( ! $stockvalue ) continue;
echo '' . date( DATE_COOKIE, $timestamp ) . ': ' . $stockvalue . '
';
}
};
echo 'Current Stock: ' . $product->get_stock_quantity() . '
';
}
}