Добавьте больше товаров для доставки заказов в woocommerce

#php #wordpress #woocommerce #hook-woocommerce

Вопрос:

Каждый товар в корзине имеет свою собственную посылку, но я планирую поместить товары с категорией экспресс в отдельную посылку. Мне удалось сделать это с помощью крючка woocommerce_cart_shipping_packages, как показано ниже:

 function custom_split_shipping_packages_shipping_class( $packages ) {

// Reset all packages
$packages            = array();
$cb_item_product_ids = array();
$frozen_package_items = array();
$aggregate_frozen_package_name = array();

foreach ( WC()->cart->get_cart() as $item_key => $item ) {

//hide delivery time picker for coupons
$isCouponProduct = has_term( array( 'coupon' ), 'product_cat', $item['product_id'] );

if ( $item['data']->needs_shipping() amp;amp; ! $isCouponProduct ) {
    $package_category_result = get_fulfillment_package_category( $item['product_id'] ); //get category_slug from fulfillment_categories
    $is_frozen =  strpos( $package_category_result['slug'], 'frozen' ) !== false;

    if($is_frozen) {
        $frozen_package_items[ $item_key ] = $item;

        $package_content_result = cb_get_package_content_details( $item['variation'], $item['product_id'] );
        $package_name =  current( $package_content_result )['package_name'];
        $aggregate_frozen_package_name[] = "{$package_name} amp;times; {$item['quantity']} ";
    }
    else {
        $array_name = "split_package_items_".$item['product_id'];
        ${$array_name}[ $item_key ] = $item;

        if ( !in_array( $item['product_id'], $cb_item_product_ids ) ) {
            $cb_item_product_ids[] = $item['product_id'];
        }
    }
}
    }

// Create shipping packages
if ( ! empty( $frozen_package_items ) ) {
    $packages[] = array(
        'contents'        => $frozen_package_items,
        'aggregate_package_name' =>  implode( ", ", $aggregate_frozen_package_name ),
        'contents_cost'   => array_sum( wp_list_pluck( $frozen_package_items, 'line_total' ) ),
        'applied_coupons' => WC()->cart->get_applied_coupons(),
        'user'            => array(
            'ID' => get_current_user_id(),
        ),
        'destination'    => array(
            'country'    => WC()->customer->get_shipping_country(),
            'state'      => WC()->customer->get_shipping_state(),
            'postcode'   => WC()->customer->get_shipping_postcode(),
            'city'       => WC()->customer->get_shipping_city(),
            'address'    => WC()->customer->get_shipping_address(),
            'address_2'  => WC()->customer->get_shipping_address_2()
        )
    );
}

foreach($cb_item_product_ids as $key => $product_id ) {
$array_name = "split_package_items_".$product_id;

$packages[] = array(
  'contents'        => $array_name,
  'contents_cost'   => array_sum( wp_list_pluck( $array_name, 'line_total' ) ),
  'applied_coupons' => WC()->cart->get_applied_coupons(),
  'user'            => array(
     'ID' => get_current_user_id(),
  ),
  'destination'    => array(
    'country'    => WC()->customer->get_shipping_country(),
    'state'      => WC()->customer->get_shipping_state(),
    'postcode'   => WC()->customer->get_shipping_postcode(),
    'city'       => WC()->customer->get_shipping_city(),
    'address'    => WC()->customer->get_shipping_address(),
    'address_2'  => WC()->customer->get_shipping_address_2()
  )
);

}

return $packages;
}
add_filter( 'woocommerce_cart_shipping_packages',  'custom_split_shipping_packages_shipping_class' );
 

Когда заказ размещен, количество записей о товарах доставки заказа равно количеству отправленных посылок, но я хочу, чтобы они были равны количеству отправленных товаров.

Как я могу создать дополнительные товары для доставки? Я думаю, что есть крючок woocommerce_checkout_create_order_shipping_item, но я могу найти хороший пример того, как его использовать.

введите описание изображения здесь