Woocommerce Доставка с несколькими поставщиками без плагина или пользовательского плагина

#php #wordpress #woocommerce

Вопрос:

Я Хочу Рассчитать Тарифы на Доставку и Отобразить Способы Доставки WooCommerce на Странице Корзины и Оформления Заказа (Либо Рассчитать и Отобразить Тарифы на Доставку WooCommerce Отдельно для Каждого Поставщика, Либо Добавить Стоимость Доставки WooCommerce для Каждого Поставщика и Отобразить Окончательную Стоимость Доставки на Странице Корзины).

Есть много доступных плагинов, но я хочу сделать это без плагина(functions.php) или создать свой собственный плагин.

 $packages[] = array(
                'ship_via' => $shipping_method_ids ?: array('flat_rate', 'local_pickup', 'free_shipping'),
                'name' => $shipping_class_name,
                'contents' => $new_package,
                'contents_cost' => array_sum(wp_list_pluck($new_package, 'line_total')),
                'applied_coupons' => WC()->cart->applied_coupons,
                '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()
                )
            );
 

Я сделал создание отдельной посылки с точки зрения доставки. но я хочу создать то же самое (скользящая доставка) в соответствии с требованиями поставщика.

Короче говоря

  • Поставщик A -> Доставка(1,2,3..)
  • Поставщик B -> Доставка(1,2,3..)
  • Поставщик C -> Доставка(1,2,3..)

.

.

.

и т.д…

Смотрите скриншот для получения дополнительной информации. введите описание изображения здесь

Ответ №1:

Наконец-то мы получили ответ на этот вопрос.

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

 // Get Vendor ID from Prduct ID - Method 1 (Compatible with woocommerce-product-vendors plugin)
function get_product_vendors_1( $product_id = null ) {
    if ( null === $product_id ) {
        return null;
    }

    $term = wp_get_object_terms( $product_id, WC_PRODUCT_VENDORS_TAXONOMY, array( 'fields' => 'ids' ) );

    if ( is_wp_error( $term ) || empty( $term ) ) {
        return null;
    }

    return $term[0];
}

// Get Vendor ID from Prduct ID - Method 2
function get_user_roles_by_user_id( $user_id = null, $role = array('vendors') ) {
    $user = get_userdata( $user_id );
    $user_roles = array_intersect($user->roles,$role);
    if (isset($user_roles) amp;amp; !empty($user_roles)) {
        return $user_id;
    }
    return false;
}

function get_product_vendors_2($product_id = null){
    // Vendors roles - you can change accordingly
    $role = array(
        'wc_product_vendors_pending_vendor', 
        'wc_product_vendors_manager_vendor',
        'wc_product_vendors_admin_vendor'
    );
    $user_id = get_post_field( 'post_author', $product_id );
    if(get_user_roles_by_user_id( $user_id, $role)){
        return $user_id;
    }
    return false;
}

// Now you can use one of them
get_product_vendors_1($product_id)
or
get_product_vendors_2($product_id)
 

Теперь Несколько Поставщиков Разделяют Доставку полного исходного кода.

 add_filter('woocommerce_cart_shipping_packages', 'woo_multi_vendors_shipping_packages');

function woo_multi_vendors_shipping_packages($packages)
{
    $i = 1;
    $packages = $vendor_items_map = array();

    foreach (WC()->cart->get_cart() as $cart_item) 
    {
        if ($cart_item['data']->needs_shipping()) 
        {
            $product_id  = $cart_item['product_id'];

            // Get vendors for each product.
            // $vendor = get_product_vendors_2( $product_id);
            $vendor = get_product_vendors_1( $product_id);

            $vendor_id = isset($vendor) ? (int)$vendor : 0;

            $vendor_items_map[$vendor_id][] = $cart_item;
        }
    }

    foreach($vendor_items_map as $vendor_id => $vendor_items) {
        if(!empty($vendor_items)){
            $packages_name = null;
            if($vendor_id){
                $user_displayname = get_term($vendor_id)->name ?: '';
                if($user_displayname){
                    $packages_name = '<span class="ship-name">Shipping #'.$i.'</span><span class="vendor-name">'.$user_displayname.'</span>';
                }
            }
            $packages[] = array(
                //'ship_via' => array( 'flat_rate' ),
                'name' => $packages_name ?: null,
                'contents' => $vendor_items,
                'contents_cost' => array_sum( wp_list_pluck( $vendor_items, 'line_total' ) ),
                'applied_coupons' => WC()->cart->applied_coupons,
                '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()
                )
            );  
        }
        $i  ;
    }
    return $packages;
}