I need so help. I'm trying to update the woocommerce product stock quantity programmatically. We have a vendor feed to us through some JSON. I can read the stock from the feed and can pull the data from the post meta correctly. I'm using the latest version of WP and WOO. PHP is 7.2
Below is how I am finding the Product ID from the SKU.
$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );
This is returning the correct ID and I can use it to see the current metadata that is already there:
$website_stock = get_post_meta($product_id, '_stock', true);
echo "Website Stock - " . $website_stock . "</br>";
$website_stock_status = get_post_meta($product_id, '_stock_status', true);
echo "Website Stock Status - " . $website_stock_status . "</br>";
I then update the stock I am getting from the feed. This can be stock going from zero to x or x to zero and anywhere in between. This is how I am updating the out of stock:
$out_of_stock_staus = 'outofstock';
update_post_meta($product_id, '_stock', 0);
update_post_meta($product_id, '_stock_status', wc_clean( $out_of_stock_staus ));
wc_delete_product_transients( $product_id ); // Clear/refresh the variation cache
This is where it gets weird.
Updated sku
The data is showing correctly inside the product view in the admin panel. As a side note, this SKU can belong to a variation (we have tons of them) or it could be a simple product. In the end, they all seem to update ok. No errors are being generated that I can see.
I use a little PHP snippet in my functions.php that greys the out of stock items in the drop down. Here it is:
/* Grey out out of stock items in the product dropdown */
add_filter( 'woocommerce_variation_is_active', 'grey_out_variations_when_out_of_stock', 10, 2 );
function grey_out_variations_when_out_of_stock( $grey_out, $variation ) {
if ( ! $variation->is_in_stock() )
return false;
return true;
}
So the issues are:
Any help that anyone can provide would be greatly appreciated!
Thank you
If the 'Stock display format' option on WooCommerce → Settings → Products → Inventory is set to display the quantity remaining in stock, then every product will have detailed stock information. In stock products will display the exact number remaining in stock.
Update 2
Since woocommerce 3 "outofstock" product status is saved in 2 locations:
- As post meta data for
_stock_status
meta key (just as before).- As a post term name
outofstock
remaining toproduct_visibility
custom taxonomy
That means that you missed just a step (the step 3):
$out_of_stock_staus = 'outofstock';
// 1. Updating the stock quantity
update_post_meta($product_id, '_stock', 0);
// 2. Updating the stock quantity
update_post_meta( $product_id, '_stock_status', wc_clean( $out_of_stock_staus ) );
// 3. Updating post term relationship
wp_set_post_terms( $product_id, 'outofstock', 'product_visibility', true );
// And finally (optionally if needed)
wc_delete_product_transients( $product_id ); // Clear/refresh the variation cache
It hope that it will work with your cron job.
Original answer
Your code is a bit outdated since woocommerce 3 and there is no specifically a stock status setting for product variations...
There is a dedicated function in woocommerce to get the product Id from the sku that you could use:
wc_get_product_id_by_sku( $product_sku );
For the parent variable product, you should not need to enabled stock management as this is done in each of its product variations (so at the product variation level).
Since woocommerce 3, the "outofstock" stock status is also managed thought a custom taxonomy
product_visibility
which term name isoutofstock
. So updating post meta is not enough.
Also is better to use the new CRUD setters and getters methods introduced with woocommerce 3.
So try the following code instead:
// get the product ID from the SKU
$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );
// Get an instance of the WC_Product object
$product = new WC_Product( $product_id );
// Get product stock quantity and stock status
$stock_quantity = $product->get_stock_quantity();
$stock_status = $product->get_stock_status();
// Display stock quantity and status
echo '<p>Product Stock quantity: ' . $stock_quantity . '</br>
Product Stock status: ' . $stock_status . '</p></br>';
// Set product stock quantity (zero) and stock status (out of stock)
$product->set_stock_quantity();
$product->set_stock_status('outofstock');
// Save the data and refresh caches
$product->save();
Tested and works in a normal context (but apparently not with a cron job)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With