/ Сайтостроение / Плагины / Пользовательский метод доставки

Пользовательский метод доставки

02.11.2019

63

Создадим пользовательский метод доставки для Woocommerce 3.0.

Метод создадим в виде плагина.

<?php
 
/**
 * Plugin Name: Shop Custom Shipping Method
 * Plugin URI: 
 * Description: Custom Shipping Method for WooCommerce
 * Version: 1.0.0
 * Author: 
 * Author URI: 
 * License: GPL-3.0+
 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
 * Domain Path: 
 * Text Domain: 
 */
 
if ( ! defined( 'WPINC' ) ) { die; }
 
// Check if WooCommerce is active
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
 
	add_action( 'woocommerce_shipping_init', 'econt_shipping_method' );
	function econt_shipping_method() {
	  if ( ! class_exists( 'WC_Econt_Shipping_Method' ) ) {
		class WC_Econt_Shipping_Method extends WC_Shipping_Method {
			
		public function __construct( $instance_id = 0 ) {
			$this->instance_id 	  = absint( $instance_id );
			$this->id                 = 'econt';//this is the id of our shipping method
			$this->method_title       = __( 'Доставка ТК', 'teame' );
			$this->method_description = __( 'Доставка товара транспортной компанией', 'teame' );
			//add to shipping zones list
			$this->supports = array(
				'shipping-zones',
				//'settings', //use this for separate settings page
				'instance-settings',
				'instance-settings-modal',
			);
			//make it always enabled
			$this->title = __( 'Доставка ТК', 'teame' );
			$this->enabled = 'yes';
			$this->init();
		}
		  
		function init() {
			// Load the settings API
			$this->init_form_fields();
			$this->init_settings();
			// Save settings in admin if you have any defined
			add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
		}
		  
		//Fields for the settings page
		function init_form_fields() {
			//fileds for the modal form from the Zones window
			$this->instance_form_fields = array(
				'title' => array(
					'title' => __( 'Название', 'teame' ),
					'type' => 'text',
					'description' => __( 'Доставка ТК', 'teame' ),
					'default' => __( 'Доставка товара транспортной компанией', 'teame' )
				),
				'cost' => array(
					'title' => __( 'Стоимость', 'teame' ),
					'type' => 'number',
					'description' => __( 'Стоимость доставки', 'teame' ),
					'default' => 500
				),
			);
			//$this->form_fields - use this with the same array as above for setting fields for separate settings page
		}
		  
		public function calculate_shipping( $package = array()) {
		//as we are using instances for the cost and the title we need to take those values drom the instance_settings
			$intance_settings =  $this->instance_settings;
			// Register the rate
			$this->add_rate( array(
				'id'      => $this->id,
				'label'   => $intance_settings['title'],
				'cost'    => $intance_settings['cost'],
				'package' => $package,
				'taxes'   => false,
			)
			);
		}
		  
		}
	  }
	  
	  //add your shipping method to WooCommers list of Shipping methods
	  add_filter( 'woocommerce_shipping_methods', 'add_econt_shipping_method' );
	  function add_econt_shipping_method( $methods ) {
		  $methods['econt'] = 'WC_Econt_Shipping_Method';
		  return $methods;
	  }
	}

}

Создадим для пользовательского метода уведомление при превышении веса (лимит установлен на 0):

function econt_validate_order( $posted )   {

	$packages = WC()->shipping->get_packages();
	$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
	
	if( is_array( $chosen_methods ) && in_array( 'econt', $chosen_methods ) ) {
		 
		foreach ( $packages as $i => $package ) {

			if ( $chosen_methods[$i] != "econt" ) { continue; } // Проверяем только пользовательский метод доставки
			
			// Получим общий вес заказа
			global $woocommerce;
			$total_weight = $woocommerce->cart->cart_contents_weight;
			
			// Определяем лиммит веса
			$weightLimit = 5;
			
			// Вычисляем разницу
			$difference = $total_weight - $weightLimit;
			
			// Получаем единицу измерения
			$unit = get_option('woocommerce_weight_unit');			

			if( $total_weight > $weightLimit ) {

				$message = sprintf( __( 'Вы превысили лимит по весу на %d %s', 'teame' ), $difference, $unit );
						 
				$messageType = "error";

				if( ! wc_has_notice( $message, $messageType ) ) {
					wc_add_notice( $message, $messageType );
				}
			}
		}       
	} 
}
 
add_action( 'woocommerce_review_order_before_cart_contents', 'econt_validate_order' , 10 );
add_action( 'woocommerce_after_checkout_validation', 'econt_validate_order' , 10 );	

т.е. если у нас будет в корзине хоть какой-то вес и выбран пользовательский метод доставки, то выведется предупреждение «Вы превысили лимит по весу» и не даст совершить заказ.

Стоимость доставки в зависимости от веса

В функции calculate_shipping( $package = array()) задается стоимость метода доставки. Стоимость доставки в зависимости от общего веса:

public function calculate_shipping( $package = array()) {
	$intance_settings =  $this->instance_settings;
	
	global $woocommerce;
	$total_weight = $woocommerce->cart->cart_contents_weight;
	
	$cost = $total_weight * 30; // 30 руб/кг
	
	// Register the rate
	$this->add_rate( array(
		'id'      => $this->id,
		'label'   => $intance_settings['title'],
		//'cost'    => $intance_settings['cost'],
		'cost'    => $cost,
		'package' => $package,
		'taxes'   => false,
	)
	);
	
}

Зависимость от того физическим или юридическим лицом является покупатель:

if( WC()->session->get( 'is_company' ) ){
	$cost = 320000;
} else {
	$cost = 7450;
}

Но для того чтобы стоимость доставки пересчитывалась динамически нужно прописать функцию:

// Ajax-обновление стоимости метода доставки
add_action('woocommerce_checkout_update_order_review', 'checkout_update_refresh_shipping_methods', 10, 1);
function checkout_update_refresh_shipping_methods( $post_data ) {
    $packages = WC()->cart->get_shipping_packages();
    foreach ($packages as $package_key => $package ) {
         WC()->session->set( 'shipping_for_package_' . $package_key, false ); // Or true
    }
}

Тэги:

Поделится информацией с друзьями

  • Похожие записи
  • Комментарии
  • Вложения
Интеграция Woocommerce с 1С

Интеграция Woocommerce с 1С

Deprecated: Function create_function() is deprecated in /home/t/tiberi6w/opttour.ru/public_html/wp-content/plugins/wp-spamshield/wp-spamshield.php on line 2033

Интеграция Woocommerce с 1С — довольно сложная тема с множеством нюансов. Буду описывать на что стоит обращать внимание, с какими проблемами пришлось столкнуться. Плагин 1С:Предприятие Data Exchange Так как не Читать далее »

Сообщения woocommerce

Сообщения woocommerce

Сообщения woocommerce — система сопроводительной информации при использовании интернет-магазина. В системе есть 3 типа сообщений: информационные (notice), успешные действия (success), ошибки/предупреждения (error) Стандартные сообщения Это перечень стандартных сообщений разделенных по Читать далее »

Фильтры Woocommerce

Фильтры Woocommerce

В базовую комплектацию Woocommerce входит набор виджетов для фильтрации товаров. Но данные виджеты необходимо несколько доработать. WooCommerce Навигация по слоям В этом виджете необходимо задать атрибут товара по которому будет Читать далее »

/ /

Добавить комментарий

Пока нет комментариев. Будь первым!

Пользовательский метод доставки
Datetimepicker
Рекомендации для васDatetimepickerOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.