Показать стоимость доставки на странице продукта – WooCommerce

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

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

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

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

Solutions Collecting From Web of "Показать стоимость доставки на странице продукта – WooCommerce"

Этот вопрос слишком широк. Поэтому я могу частично ответить, так как вам нужно будет сделать какую-то работу самостоятельно и задать более конкретные вопросы …

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

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

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

Затем вам нужно будет обновить страну клиента в WC()->session и в WC()->customer объектах 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.

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

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

  • Переопределение шаблонов Woocommerce через вашу тему (и шаблоны подписчиков WC)
  • Использование доступных фильтров и крючков для действий
  • Используйте Javascript , jQuery, чтобы изменить цены и Ajax для обновления данных клиента ( WC_Session и WC_Customer ).

Вам нужно будет получить / установить / обновить «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 );