web-dev-qa-db-fra.com

Mise à jour du stock de produits par programme dans Woocommerce 3

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.

Sku mis à jour

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:

  • L'élément maintenant en rupture de stock ne devrait pas apparaître comme cliquable dans la liste déroulante, mais il l'est toujours.
  • Le stock sur le front-end ne dit pas toujours zéro, il vous permet d'en sélectionner un, puis dit qu'il n'y a pas de stock, donc le bouton Ajouter au panier est actif et ne devrait pas l'être. Donc, le front-end ne voit pas les mises à jour.
  • Le panneau d'administration Woocommerce pour les produits n'est pas en rupture de stock pour le parent, je dois faire une modification et une mise à jour rapides pour que cela se produise.
  • Fondamentalement, le back-end voit les changements, mais le front-end ne s'affiche pas vraiment correctement.

Toute aide que n'importe qui peut fournir serait grandement appréciée!

Merci

9
Dave

Mise à jour 2

Étant donné que le statut du produit "hors stock" de woocommerce 3 est enregistré dans 2 emplacements:

  1. En tant que post-métadonnées pour _stock_status touche méta (comme précédemment).
  2. 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 est outofstock. 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)

8
LoicTheAztec