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는 베리에이션(수톤)에 속하거나 단순한 제품일 수 있습니다.결국 모두 정상적으로 업데이트 된 것 같습니다.내가 볼 수 있는 에러는 표시되지 않습니다.
저는 제 기능에 약간의 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 "품절" 제품 상태는 다음 두 곳에 저장됩니다.
- 에 대한 메타
_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 );
상위 변수 제품의 경우 재고 관리는 각 제품 변형(제품 변동 수준)에서 수행되므로 재고 관리를 활성화할 필요가 없습니다.
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($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
'programing' 카테고리의 다른 글
mysql과 oracle sql의 주요 차이점은 무엇입니까? (0) | 2023.03.28 |
---|---|
wordpress - stackoverflow와 같은 인라인 에이잭스 코멘트가 있습니다. (0) | 2023.03.28 |
Spring REST 여러 @RequestBody 파라미터가 가능합니까? (0) | 2023.03.28 |
Wordpress Plugin 개발 중 타사 종속성 충돌 (0) | 2023.03.28 |
wordpress 플러그인 페이지에서 현재 페이지 ID 가져오기 (0) | 2023.03.28 |