J'ai tellement besoin d'aide. J'essaie de mettre à jour la quantité de stock de produits woocommerce par programme. Nous avons un flux de fournisseur pour nous via du JSON. Je peux lire le stock du flux et extraire correctement les données de la méta post. J'utilise la dernière version de WP et WOO. PHP est 7.2
Voici comment je trouve l'ID de produit dans la référence.
$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );
Cela renvoie l'ID correct et je peux l'utiliser pour voir les métadonnées actuelles qui sont déjà là:
$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>";
Je mets ensuite à jour le stock que je reçois du flux. Cela peut être un stock allant de zéro à x ou x à zéro et n'importe où entre les deux. Voici comment je mets à jour le stock épuisé:
$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
C'est là que ça devient bizarre.
Les données s'affichent correctement dans la vue du produit dans le panneau d'administration. En remarque, ce SKU peut appartenir à une variation (nous en avons des tonnes) ou il peut s'agir d'un simple produit. Au final, ils semblent tous se mettre à jour correctement. Aucune erreur n'est générée que je peux voir.
J'utilise un petit PHP snippet dans mon functions.php qui grise les articles en rupture de stock dans le menu déroulant. Le voici:
/* 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;
}
Les problèmes sont donc les suivants:
Toute aide que n'importe qui peut fournir serait grandement appréciée!
Merci
Mise à jour 2
Étant donné que le statut du produit "hors stock" de woocommerce 3 est enregistré dans 2 emplacements:
- En tant que post-métadonnées pour
_stock_status
touche méta (comme précédemment).- En tant que nom de terme de publication
outofstock
restant àproduct_visibility
taxonomie personnalisée
Cela signifie que vous avez raté une étape (( étape 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
Il espère que cela fonctionnera avec votre travail cron.
Réponse originale
Votre code est un peu dépassé depuis woocommerce 3 et il n'y a pas spécifiquement de paramètre d'état des stocks pour les variations de produits ...
Il y a une fonction dédiée dans woocommerce à obtenir l'ID du produit à partir du sk que vous pourriez utiliser:
wc_get_product_id_by_sku( $product_sku );
Pour le produit variable parent , vous ne devez pas activer la gestion des stocks comme cela se fait dans chacune de ses variations de produit (donc au niveau de la variation du produit).
Depuis woocommerce 3, l'état du stock "outofstock" est également géré grâce à une taxonomie personnalisée
product_visibility
dont le nom de terme estoutofstock
. La mise à jour de la méta-publication ne suffit donc pas.
Il est également préférable d'utiliser les nouvelles méthodes de définition et d'obtention de CRUD introduites avec woocommerce 3.
Essayez donc le code suivant à la place:
// 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();
Testé et fonctionne dans un contexte normal (mais apparemment pas avec un travail cron)