code

WooCommerce: 가변 제품을 사용하여 프로그래밍 방식으로 주문 작성

starcafe 2023. 2. 8. 19:40
반응형

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

반응형