programing

Woocommerce 3에서 프로그램 방식으로 제품 재고 업데이트

lastmoon 2023. 3. 28. 22:30
반응형

Woocommerce 3에서 프로그램 방식으로 제품 재고 업데이트

도움이 필요해요.프로그램적으로 woocommerce 제품 재고 수량을 업데이트하려고 합니다.JSON을 통해 벤더 피드가 제공되고 있습니다.피드에서 재고를 읽을 수 있고 포스트 메타에서 데이터를 올바르게 가져올 수 있습니다.WP와 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를 반환하고 있으며, 이 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>";

그런 다음 피드로부터 얻은 재고를 업데이트합니다.이것은 0에서 x로, 또는 x에서 0으로, 그리고 그 사이의 어느 곳에서도 주식이 이동할 수 있습니다.품절된 재고를 갱신하는 방법은 다음과 같습니다.

$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

데이터는 관리 패널의 제품 뷰에 올바르게 표시됩니다.참고로 이 SKU는 베리에이션(수톤)에 속하거나 단순한 제품일 수 있습니다.결국 모두 정상적으로 업데이트 된 것 같습니다.내가 볼 수 있는 에러는 표시되지 않습니다.

저는 제 기능에 약간의 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;
}

문제는 다음과 같습니다.

  • 현재 품절된 아이템은 드롭다운에 클릭 가능한 아이템으로 표시되지 않지만 여전히 표시됩니다.
  • 프런트 엔드의 재고가 항상 0이라고 하는 것은 아닙니다.하나를 선택하면 재고가 없다고 말하기 때문에 카트 추가 버튼이 활성화되어 있으면 안 됩니다.프런트 엔드는 업데이트를 볼 수 없습니다.
  • 제품의 Woocommerce 관리 패널이 품절된 제품을 부모에게 롤업하지 않습니다.그러기 위해서는 빠른 편집과 갱신을 해야 합니다.
  • 기본적으로 백엔드는 변경을 인식하지만 프론트엔드는 올바르게 표시되지 않습니다.

아무나 도와주시면 감사하겠습니다!

감사해요.

업데이트 2

woocommerce 3 "품절" 제품 상태는 다음 두 곳에 저장됩니다.

  1. 에 대한 메타 _stock_status메타 키(이전과 동일)
  2. 으로서 ★★★★★★★★★★★★★★★★★★★★★★★★★」outofstockproduct_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 );

상위 변수 제품의 경우 재고 관리는 각 제품 변형(제품 변동 수준)에서 수행되므로 재고 관리를 활성화할 필요가 없습니다.

woocommerce 3 이후, "재고 부족" 재고 상태도 커스텀 분류법으로 관리합니다. product_visibility어떤 용어명이outofstock따라서 포스트 메타 업데이트로는 충분하지 않습니다.

또한 woocommerce 3에서 도입된 새로운 CRUD 세터getters 메서드를 사용하는 것이 좋습니다.

대신 다음 코드를 사용해 보십시오.

// 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 작업에서는 동작하지 않는 것 같습니다).

Loic The Aztecs 업데이트는 정상적으로 작동합니다(감사합니다).

하지만 생각해 봤는데왜 WC 표준 기능이 없는 거죠?

그래서 내가 찾은 건

wc_update_product_stock 함수

 wc_update_product_stock($product, $stock_quantity=null, $operation='set', $updating = false)
  • @syslog int|WC_Product | $product | 제품 ID 또는 제품 인스턴스.
  • @param int| null | $stock_quantity 재고 수량.
  • @param string | $operation 조작 유형. 'set', 'increase' 및 'decrease'를 허용합니다.
  • @param bool | $updating | true일 경우 제품 오브젝트는 나중에 갱신되므로 여기에 저장되지 않습니다.
  • @return bool|int|개요

언급URL : https://stackoverflow.com/questions/51940338/updating-product-stock-programmatically-in-woocommerce-3

반응형