WooCommerce: 가변 제품을 사용하여 프로그래밍 방식으로 주문 작성
프로그래밍 방식으로 주문을 작성하려고 합니다.사용.wc_create_order()
이것은 매우 간단합니다.
$myProduct = new WC_Product(100);
$order = wc_create_order();
$order->add_product($myProduct, 1);
$order->calculate_totals();
이것은 예상대로 동작하며, ID 100의 심플한 제품에 대해 올바른 금액의 주문이 작성됩니다.
그러나 이것을 변형하여 실행하려고 하면 올바르게 동작하지 않는 것 같습니다.많은 시행착오 끝에, 저는 이런 식으로 일을 하게 되었습니다.
$membershipProduct = new WC_Product_Variable(100);
$theMemberships = $membershipProduct->get_available_variations();
$trueProduct = new WC_Product(100);
$variationsArray = array();
foreach ($theMemberships as $membership) {
if ($membership['sku'] == $chosenVariation) {
$variationID = $membership['variation_id'];
$variationsArray = $membership['attributes'];
}
}
if ($variationID) {
$trueProduct->variation_id = $variationID;
}
$order = wc_create_order();
$order->add_product($trueProduct, 1, $variationsArray);
$order->calculate_totals();
그러나 올바른 제품과 올바른 변동 ID를 사용하여 주문을 작성하지만 주문의 합계는 항상 0입니다(공교롭게도 첫 번째 변동의 가격이 됩니다).
원래 나는 노력하고 있었다.$order->add_product()
에서 생성된 오브젝트를 사용하여new WC_Product_Variable()
그러나, 그 결과, 주문에 제품이 전혀 추가되지 않았기 때문에, 가변 제품에서 프로그래밍 방식으로 주문을 작성하는 것은 문제가 있다고 생각합니다.그러나 이러한 콜의 WooCommerce 소스 코드를 따라가면 내가 무엇을 잘못하고 있는지 알 수 없습니다.
부족한 점이나 가변 제품으로 주문을 작성하는 더 좋은 방법이 있습니까?
해결했다.
이 방법을 시도해 봤지만 실패했다고 맹세할 수 있었지만, 대답은 모제품을 추가하지 않는 것이었습니다.$trueProduct
이 예에서는) 단, ID를 기준으로 변동곱을 추가합니다.
이것은 @helgatheviking이 지적한 바와 같이 이전에 실패했을 수 있습니다.$variationsArray
소스에 따라 포맷이 잘못되어 있었다.['variation']
올바른 속성 변동 배열을 전송하려면 키를 누릅니다.
전체적으로 작업 코드는 다음과 같습니다.
$membershipProduct = new WC_Product_Variable(100);
$theMemberships = $membershipProduct->get_available_variations();
$variationsArray = array();
foreach ($theMemberships as $membership) {
if ($membership['sku'] == $chosenVariation) {
$variationID = $membership['variation_id'];
$variationsArray['variation'] = $membership['attributes'];
}
}
if ($variationID) {
$varProduct = new WC_Product_Variation($variationID);
$order = wc_create_order();
$order->add_product($varProduct, 1, $variationsArray);
$order->calculate_totals();
}
variation_id가 이미 있는 경우 이 작업을 수행할 수 있습니다.
$product_variation = new WC_Product_Variation($variation_id);
$order = wc_create_order();
$args=array();
foreach($product_variation->get_variation_attributes() as $attribute=>$attribute_value){
$args['variation'][$attribute]=$attribute_value;
}
$order->add_product($product_variation, $product['quantity'], $args);
다음은 나에게 효과가 있었던 솔루션입니다.
function add_item_to_order( $order_id, $prod_id ) {
$order = wc_get_order( $order_id );
$_product = wc_get_product( $prod_id );
// Set values
$item = array();
$item['product_id'] = $_product->id;
$item['variation_id'] = isset( $_product->variation_id ) ? $_product->variation_id : '';
$item['variation_data'] = $item['variation_id'] ? $_product->get_variation_attributes() : '';
$item['name'] = $_product->get_title();
$item['tax_class'] = $_product->get_tax_class();
$item['qty'] = 1;
$item['line_subtotal'] = wc_format_decimal( $_product->get_price_excluding_tax() );
$item['line_subtotal_tax'] = '';
$item['line_total'] = wc_format_decimal( $_product->get_price_excluding_tax() );
$item['line_tax'] = '';
$item['type'] = 'line_item';
// Add line item
$item_id = wc_add_order_item( $order_id, array(
'order_item_name' => $item['name'],
'order_item_type' => 'line_item'
) );
// Add line item meta
if ( $item_id ) {
wc_add_order_item_meta( $item_id, '_qty', $item['qty'] );
wc_add_order_item_meta( $item_id, '_tax_class', $item['tax_class'] );
wc_add_order_item_meta( $item_id, '_product_id', $item['product_id'] );
wc_add_order_item_meta( $item_id, '_variation_id', $item['variation_id'] );
wc_add_order_item_meta( $item_id, '_line_subtotal', $item['line_subtotal'] );
wc_add_order_item_meta( $item_id, '_line_subtotal_tax', $item['line_subtotal_tax'] );
wc_add_order_item_meta( $item_id, '_line_total', $item['line_total'] );
wc_add_order_item_meta( $item_id, '_line_tax', $item['line_tax'] );
wc_add_order_item_meta( $item_id, '_line_tax_data', array(
'total' => array(),
'subtotal' => array() )
);
// Store variation data in meta
if ( $item['variation_data'] && is_array( $item['variation_data'] ) ) {
foreach ( $item['variation_data'] as $key => $value ) {
wc_add_order_item_meta( $item_id, str_replace( 'attribute_', '', $key ), $value );
}
}
}
$item['item_meta'] = $order->get_item_meta( $item_id );
$item['item_meta_array'] = $order->get_item_meta_array( $item_id );
$item = $order->expand_item_meta( $item );
$order->calculate_totals();
}
언급URL : https://stackoverflow.com/questions/32542793/woocommerce-creating-an-order-programmatically-with-a-variable-product
'code' 카테고리의 다른 글
JDBC를 사용하여 Oracle 데이터베이스에 연결하기 위한 URL 문자열 형식 (0) | 2023.02.12 |
---|---|
레디스냐, 에캐시냐? (0) | 2023.02.12 |
ng-repeat 내에서 ng-click 시 숨겨진 div 표시 (0) | 2023.02.08 |
"Unparseable date: 13028677828"이 서버로부터 받은 밀리초 형식의 날짜를 Gson으로 역직렬화하려고 합니다. (0) | 2023.02.08 |
Word Press:add_filter를 사용할 때 값을 반환하는 방법 (0) | 2023.02.08 |