私はとても助けが必要です。 woocommerce製品の在庫数量をプログラムで更新しようとしています。 JSONを介してベンダーフィードを提供しています。フィードから在庫を読み取り、ポストメタからデータを正しく取得できます。 WP and WOOの最新バージョンを使用しています。PHPは7.2
以下は、SKUからプロダクトIDを見つける方法です。
$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );
これは正しいIDを返しているので、それを使用して、すでに存在する現在のメタデータを確認できます。
$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>";
次に、フィードから取得する在庫を更新します。これは、ゼロからx、またはxからゼロ、およびその間の任意の場所にあるストックです。これは私が在庫切れを更新する方法です:
$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
これは奇妙なところです。
データは、管理パネルの製品ビュー内に正しく表示されています。サイドノートとして、このSKUはバリエーションに属することができます(多数あります)か、単純な製品である可能性があります。最終的に、それらはすべて正常に更新されるようです。確認できるエラーは生成されていません。
私は、ドロップダウンで在庫切れのアイテムを灰色にする、functions.phpで小さなPHPスニペットを使用します。ここにあります:
/* 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;
}
問題は次のとおりです。
誰でも提供できるヘルプは大歓迎です!
ありがとうございました
更新2
Woocommerce 3の「在庫切れ」製品ステータスは2つの場所に保存されるため:
_stock_status
メタキーのメタデータの投稿として(以前と同様)。- 投稿用語名として
outofstock
残りproduct_visibility
カスタム分類
つまり、ステップを1つ逃したことを意味します((ステップ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
Cronジョブで動作することを願っています。
元の答え
あなたのコードはwoocommerce 3以来少し古く、製品バリエーションのための在庫ステータス設定は特にありません...
Woocommerceには専用の機能があり、 sku から製品IDを取得できます:
wc_get_product_id_by_sku( $product_sku );
親変数productの場合、在庫管理を有効にするためにnot needこれは各製品バリエーションで行われるため(製品バリエーションレベルで)。
Woocommerce 3以降、「在庫切れ」の在庫ステータスも管理されます。カスタム分類
product_visibility
(用語名はoutofstock
)を考慮しました。したがって、投稿メタを更新するだけでは十分ではありません。
また、woocommerce 3で導入された 新しいCRUDセッターおよびゲッターメソッド を使用することをお勧めします。
代わりに、次のコードを試してください。
// 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();
通常のコンテキストでテストおよび動作(ただし、明らかにcronジョブではない)