Получите название класса доставки и стоимость доставки для продукта в WooCommerce

Я пытаюсь отобразить название класса доставки и фиксированную ставку доставки для продукта на странице одного продукта WooCommerce. Я использовал приведенный ниже код:

$shipping_class_id = $product->get_shipping_class_id();
$shipping_class= $product->get_shipping_class();
$fee = 0;

if ($shipping_class_id) {
   $flat_rates = get_option("woocommerce_flat_rates");
   $fee = $flat_rates[$shipping_class]['cost'];
}

$flat_rate_settings = get_option("woocommerce_flat_rate_settings");
echo 'Shipping cost: ' . ($flat_rate_settings['cost_per_order'] + $fee);

Я могу получить идентификатор класса доставки, а также ярлык класса доставки с этим кодом, но не с этикеткой. Я также не могу узнать стоимость этого конкретного класса доставки, которая представляет собой фиксированную ставку в 5 евро, как определено в разделе о зонах доставки.

Жду ваших ответов.


person hamirom    schedule 13.06.2020    source источник


Ответы (1)


1) Получите название ярлыка класса доставки (для продукта):

Класс доставки регистрируется как термин, поэтому вы можете легко получить этикетку класса доставки продукта, используя:

$shipping_class_id   = $product->get_shipping_class_id();
$shipping_class_term = get_term($shipping_class_id, 'product_shipping_class');

if( ! is_wp_error($shipping_class_term) && is_a($shipping_class_term, 'WP_Term') ) {
    $shipping_class_name  = $shipping_class_term->name;
}

2) Способы доставки:

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

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

Теперь, если у вас есть только одна зона доставки и вы хотите настроить таргетинг на конкретный метод доставки и получить название метода доставки и его приблизительную стоимость (как в настройках) на основе налогового класса продукта, попробуйте следующее :

// HERE set your targeted shipping Zone type (method ID)
$targeted_shipping_method_id = 'flat_rate';

// The product shipping class ID
$product_class_id = $product->get_shipping_class_id();

$zone_ids = array_keys( array('') + WC_Shipping_Zones::get_zones() );

// Loop through Zone IDs
foreach ( $zone_ids as $zone_id ) {
    // Get the shipping Zone object
    $shipping_zone = new WC_Shipping_Zone($zone_id);
    // Get all shipping method values for the shipping zone
    $shipping_methods = $shipping_zone->get_shipping_methods( true, 'values' );

    // Loop through Zone IDs
    foreach ( $shipping_methods as $instance_id => $shipping_method ) {
        // Shipping method rate ID
        $rate_id = $shipping_method->get_rate_id();

        // Shipping method ID
        $method_id = explode( ':', $rate_id);
        $method_id = reset($method_id);

        // Targeting a specific shipping method ID
        if( $method_id === $targeted_shipping_method_id ) {
            // Get Shipping method title (label)
            $title = $shipping_method->get_title();
            $title = empty($title) ? $shipping_method->get_method_title() : $title;

            // Get shipping method settings data
            $data = $shipping_method->instance_settings;

            ## COST:

            // For a defined shipping class
            if( isset($product_class_id) && ! empty($product_class_id) 
            && isset($data['class_cost_'.$product_class_id]) ) {
                $cost = $data['class_cost_'.$product_class_id];
            }
            // For no defined shipping class when "no class cost" is defined
            elseif( isset($product_class_id) && empty($product_class_id) 
            && isset($data['no_class_cost']) && $data['no_class_cost'] > 0 ) {
                $cost = $data['no_class_cost'];
            } 
            // When there is no defined shipping class and when "no class cost" is defined
            else {
                $cost = $data['cost'];
            }

            // Testing output
            echo '<p><strong>'.$title.'</strong>: '.$cost.'</p>';
        }
    }
}

Теперь, если вы хотите получить доступ к данным о способах доставки

person LoicTheAztec    schedule 13.06.2020
comment
Большое спасибо за этот ответ - ждал его несколько дней !! - person demsley; 24.09.2020