#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, но я могу найти хороший пример того, как его использовать.