web-dev-qa-db-ja.com

Woocommerce 3でのプログラムによる製品在庫の更新

私はとても助けが必要です。 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

これは奇妙なところです。

更新されたSK

データは、管理パネルの製品ビュー内に正しく表示されています。サイドノートとして、この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;
}

問題は次のとおりです。

  • 在庫切れのアイテムは、ドロップダウンでクリック可能として表示されるべきではありませんが、それでも表示されます。
  • フロントエンドの在庫は常にゼロとは限らず、1つ選択すると在庫がないと表示されるため、[カートに追加]ボタンがアクティブになります。したがって、フロントエンドでは更新が表示されません。
  • 製品のWoocommerce管理パネルは親に在庫切れをロールアップしていません。そのためには簡単な編集と更新を行う必要があります。
  • 基本的に、バックエンドは変更を確認しますが、フロントエンドは実際には正しく表示されません。

誰でも提供できるヘルプは大歓迎です!

ありがとうございました

9
Dave

更新2

Woocommerce 3の「在庫切れ」製品ステータスは2つの場所に保存されるため:

  1. _stock_statusメタキーのメタデータの投稿として(以前と同様)。
  2. 投稿用語名として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ジョブではない)

8
LoicTheAztec