Отображение стоимости доставки на странице продукта - WooCommerce

Я пытаюсь создать настраиваемую страницу в Wordpress, которая отображает 2 типа подписки в форме с 3 вариантами каждый (ежемесячно, 6 месяцев, 12 месяцев). У каждого варианта есть переключатель, и у меня есть общая цена, которая обновляется в реальном времени, когда пользователь нажимает на переключатели. Эта часть рабочая.

Но теперь я хочу добавить еще 3 переключателя, чтобы выбрать способ доставки. (Когда пользователь выберет один, он также обновит общую стоимость в реальном времени).

Я долго искал, как узнать стоимость доставки продукта, но ничего не помогло.

Кто-нибудь знает :)?


person Alexis Vandepitte    schedule 21.11.2017    source источник
comment
В woocommerce параметры доставки включены в корзину и оформление заказа, только после того, как вы добавили продукт в корзину, поскольку они основаны на зонах доставки (местонахождение клиента)… Поэтому, когда новый клиент что-то покупает, он может добавить соответствующие данные о местоположении необходимо для доставки на странице оформления заказа (опционально в корзине)… Для каждого способа доставки в каждой зоне доставки вы можете установить разные цены, используя классы доставки, затем вы можете установить правильный класс доставки для каждого продукта или варианта продукта… Чтобы включить выбор доставки в сам продукт представляет собой сложную и продвинутую разработку.   -  person LoicTheAztec    schedule 21.11.2017
comment
[...] Я разработчик, поэтому я могу добавить это на свою пользовательскую страницу с PHP-кодом, хуками или чем-нибудь, что может мне помочь в этом. Может быть, мне придется делать хитрые вещи, чтобы это сработало. Фактически, я сделал настраиваемую страницу с настраиваемой формой для выбора между моими подписками на переменные. Если вам нужен пример того, что я хочу, это почти то же самое, что: lepetitballon.com/subscription (извините, это на французском).   -  person Alexis Vandepitte    schedule 23.11.2017
comment
Я создал этот бесплатный плагин, который показывает стоимость доставки прямо на странице продукта, и пользователь может изменить адрес, чтобы увидеть стоимость доставки в соответствии с его местоположением wordpress.org/plugins/   -  person rajesh singh    schedule 19.10.2020


Ответы (1)


Это слишком общий вопрос. Так что я могу ответить частично, так как вам придется поработать самостоятельно, а позже задать более конкретные вопросы ...

Теперь правильный способ указать данные о доставке на странице продукта - это использовать Ajax для обновления данных, поскольку действие выполняется клиентом. на стороне клиента (браузер), избегая "публикации" и перезагружая страницу. Но это должна быть ваша работа ...

1) Местоположение клиента (для Зон доставки):

Сначала вам нужно узнать местонахождение покупателя или зону доставки.

Затем вам нужно будет обновить страну клиента в WC()->session и WC()->customer объектах. Это можно сделать следующим образом:

## Get the geolocated customer country code *(if enabled)*:
$country_code = WC()->customer->get_billing_country();
// or
// $country_code = WC()->customer->get_shipping_country();


## Set a new country code
$new_country_code = 'FR';

## 1. WC_session: set customer billing and shipping country

// Get the data
$customer_session = WC()->session->get( 'customer' );
// Change some data
$customer_session['country'] = $new_country_code; // Billing
$customer_session['shipping_country'] = $new_country_code; // Shipping
// Set the changed data
$customer_session = WC()->session->set( 'customer', $customer_session );

## 2. WC_Customer: set customer billing and shipping country

WC()->customer->set_billing_country( $new_country_code );
WC()->customer->set_shipping_country( $new_country_code );

2) Способы доставки (по Зоне доставки, с оплатой):

В Woocommerce способы доставки для зоны доставки доступны только тогда, когда покупатель добавляет товар в корзину ...

На основе этого кода ответа: Показать доставку методы для внешнего интерфейса, как в панели администратора?
мы можем создать собственный массив необходимых данных, которые будут использоваться для получения способов доставки по зонам доставки, с указанием затрат и всего необходимого.

Приведенный ниже код является более полным и включает стоимость методов доставки:

// Initializing variable
$zones = $data = $classes_keys = array();

// Rest of the World zone
$zone                                              = new \WC_Shipping_Zone(0);
$zones[$zone->get_id()]                            = $zone->get_data();
$zones[$zone->get_id()]['formatted_zone_location'] = $zone->get_formatted_location();
$zones[$zone->get_id()]['shipping_methods']        = $zone->get_shipping_methods();

// Merging shipping zones
$shipping_zones = array_merge( $zones, WC_Shipping_Zones::get_zones() );

// Shipping Classes
$shipping           = new \WC_Shipping();
$shipping_classes   = $shipping->get_shipping_classes();

// The Shipping Classes for costs in "Flat rate" Shipping Method
foreach($shipping_classes as $shipping_class) {
    //
    $key_class_cost = 'class_cost_'.$shipping_class->term_id;

    // The shipping classes
    $classes_keys[$shipping_class->term_id] = array(
        'term_id' => $shipping_class->term_id,
        'name' => $shipping_class->name,
        'slug' => $shipping_class->slug,
        'count' => $shipping_class->count,
        'key_cost' => $key_class_cost
    );
}

// For 'No class" cost
$classes_keys[0] = array(
    'term_id' => '',
    'name' =>  'No shipping class',
    'slug' => 'no_class',
    'count' => '',
    'key_cost' => 'no_class_cost'
);

foreach ( $shipping_zones as $shipping_zone ) {
    $zone_id = $shipping_zone['id'];
    $zone_name = $zone_id == '0' ? __('Rest of the word', 'woocommerce') : $shipping_zone['zone_name'];
    $zone_locations = $shipping_zone['zone_locations']; // array
    $zone_location_name = $shipping_zone['formatted_zone_location'];

    // Set the data in an array:
    $data[$zone_id]= array(
        'zone_id'               => $zone_id,
        'zone_name'             => $zone_name,
        'zone_location_name'    => $zone_location_name,
        'zone_locations'        => $zone_locations,
        'shipping_methods'      => array()
    );

    foreach ( $shipping_zone['shipping_methods'] as $sm_obj ) {
        $method_id   = $sm_obj->id;
        $instance_id = $sm_obj->get_instance_id();
        $enabled = $sm_obj->is_enabled() ? true : 0;
        // Settings specific to each shipping method
        $instance_settings = $sm_obj->instance_settings;
        if( $enabled ){
            $data[$zone_id]['shipping_methods'][$instance_id] = array(
                '$method_id'    => $sm_obj->id,
                'instance_id'   => $instance_id,
                'rate_id'       => $sm_obj->get_rate_id(),
                'default_name'  => $sm_obj->get_method_title(),
                'custom_name'   => $sm_obj->get_title(),
            );

            if( $method_id == 'free_shipping' ){
                $data[$zone_id]['shipping_methods'][$instance_id]['requires'] = $instance_settings['requires'];
                $data[$zone_id]['shipping_methods'][$instance_id]['min_amount'] = $instance_settings['min_amount'];
            }
            if( $method_id == 'flat_rate' || $method_id == 'local_pickup' ){
                $data[$zone_id]['shipping_methods'][$instance_id]['tax_status'] = $instance_settings['tax_status'];
                $data[$zone_id]['shipping_methods'][$instance_id]['cost'] = $sm_obj->cost;
            }
            if( $method_id == 'flat_rate' ){
                $data[$zone_id]['shipping_methods'][$instance_id]['class_costs'] = $instance_settings['class_costs'];
                $data[$zone_id]['shipping_methods'][$instance_id]['calculation_type'] = $instance_settings['type'];
                $classes_keys[0]['cost'] = $instance_settings['no_class_cost'];
                foreach( $instance_settings as $key => $setting )
                    if ( strpos( $key, 'class_cost_') !== false ){
                        $class_id = str_replace('class_cost_', '', $key );
                        $classes_keys[$class_id]['cost'] = $setting;
                    }

                $data[$zone_id]['shipping_methods'][$instance_id]['classes_&_costs'] = $classes_keys;
            }
        }
    }
}

// Row output (for testing)
echo '<pre>'; print_r($data); echo '</pre>';

специальные способы доставки
Теперь, если вы используете специальные методы доставки (иногда включаемые сторонними плагинами доставки), вам нужно будет сделать некоторые изменения в коде…

Расчет затрат и налогов
Вам необходимо произвести расчет налогов, поскольку расходы отображаются так же, как они установлены в настройках доставки…


3) Страница продукта

Местоположение клиента:
Сначала вам потребуется селектор местоположения (для определения зоны доставки) или установить местоположение на основе геолокации Woocommerce.

Способы доставки:
После определения зоны доставки вы можете получить соответствующие Способы доставки и ставки (расходы), отображаемые на этом на странице продукта установите переключатели для выбора способов доставки.

Чтобы получить это, вам нужно изменить отдельные страницы продукта:

Вам потребуется получить / установить / обновить selected_shipping_methods с помощью следующего кода (Ajax).

Получите выбранный способ доставки:

$chosen_shipping = WC()->session->get('chosen_shipping_methods')[0];

Установите / обновите выбранный метод доставки (через Javascript / Ajax и admin-ajax.php):

// HERE the new method ID
$method_rate_id = array('free_shipping:10');

// Set/Update the Chosen Shipping method
WC()->session->set( 'chosen_shipping_methods', $method_rate_id );
person LoicTheAztec    schedule 23.11.2017
comment
Ваш ответ мне очень поможет! Думаю, это именно то, что мне нужно. Я пропустил основную информацию о том, как работает Woocommerce. Теперь будет легче найти новую недостающую информацию. Большое вам спасибо за время, которое вы потратили на мою проблему. Я надеюсь, что это поможет и другим людям. Когда я закончу, я опубликую здесь свое решение. Хорошего дня - person Alexis Vandepitte; 23.11.2017
comment
Отличный ответ и лучшие примеры кода. Вы помогли мне сегодня. - person Erik Pöhler; 23.08.2019
comment
Спасибо за ответ! Можно ли переписать 2) The shipping methods с учетом текущей валюты? - person Yura Kosyak; 21.05.2021