/ Адаптивность / Способ доставки Деловыми линиями

Способ доставки Деловыми линиями

HIT

Внедряем в пользовательский способ доставки расчет стоимости Деловых линий.

Работа с API Деловые линии

Данный функционал я почерпнул с сайта lospirata.ru, но немного упростил.

Скрипт ajax-обмена данными:

function AjaxFormRequest(result_id, form_id,url) {
	jQuery.ajax({
		url: url,
		type: "POST",
		dataType: "html",
		data: jQuery("#"+form_id).serialize(),
		success: function(response) {
			document.getElementById(result_id).innerHTML = response;
		},
		error: function(response) {
			document.getElementById(result_id).innerHTML = "Ошибка при отправке формы";
		}
	});
}

Форма расчета:

<section id="tzTargetCalc">
	<div id="result_div_id"></div>
	<form id="tzFormCalc" action="" method="post">
	
		<h3>Город доставки</h3>
		<p><label for="moscow">Откуда</label> <input name="moscow" type="text" id="moscow" value="Москва" disabled /></p>
		<p><label for="city">Куда</label> <input name="city" type="text" id="city" list="datalist" placeholder="Населенный пункт" autocomplete="off" /></p>
		<datalist id="datalist">
		<!--[if IE]><select><!--<![endif]-->
		<option>Ангарск</option>
		<option>Курск</option>
		<!--[if IE]></select><!--<![endif]-->
		</datalist>

		<p><input id="home" name="home" type="checkbox" /> <label for="home">До адреса?</label></p>
		
		<h3>Количество слонов</h3>
		<p><label>Синих слонов</label> <input min="0" name="blue" type="number" placeholder="шт" /></p>
		<p><label>Зеленых слонов</label> <input min="0" name="green" type="number" placeholder="шт" /></p>

		<p><input type="button" value="Рассчитать стоимость доставки" id="tzUpCalc" onclick="AjaxFormRequest('result_div_id', 'tzFormCalc', '/delivery.php')" /></p>
	</form>
</section>

Содержимое файла delivery.php (обработчик запроса):

<?php
if ($_POST['city'] == "Ангарск") $code = "3800000400000000000000000";
if ($_POST['city'] == "Курск") $code = "4600000100000000000000000";


if (trim($_POST['home'])) $check = "true";
else $check = "false";


$weight = 0;
if ($_POST['blue'] > 0) { $weight += $_POST['blue'] * 20; }
if ($_POST['green'] > 0) { $weight += $_POST['green'] * 60; }


$data = array(
	"appKey" => "Ключ Деловых линий",
	"derivalPoint" => "Код_КЛАДР_пункта_отправки",
	"derivalDoor" => true,
	"arrivalPoint" => "{$code}",
	"arrivalDoor" => $check,
	"sizedVolume" => "0.2",
	"sizedWeight" => $weight
);


$json = json_encode($data);
$url = ('https://api.dellin.ru/v1/public/calculator.json');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$obj = json_decode($result);
curl_close($ch);


if ($_POST['doors'] > 0 OR $_POST['doors_2'] > 0) {
	if (trim($code)) {
		$result = ('<p>Откуда: '.$obj->{'derival'}->{'terminal'}.'<br />
		Куда: '.$obj->{'arrival'}->{'terminal'}.'<br />
		Синих слонов: '.$_POST['blue'].' шт.<br />
		Зеленых слонов: '.$_POST['green'].' шт.<br />
		Общий вес: '.$weight.' кг<br />
		Срок доставки: '.$obj->{'time'}->{'nominative'}.'<br />
		Стоимость доставки: '.$obj->{'price'}.' руб.</p>');
		echo $result;
	} else {
		echo ('<p>Вы не указали населенный пункт или Вашего города нет в списке.</p>');
	}
}
else { echo ('<p>Вы не указали количество слонов.</p>'); }

Ключ Деловых линий (ДЛ) можно получить зарегистрировавшись на сайте ДЛ.

Внедряем расчет ДЛ в метод доставки

Должен быть подключен КЛАДР.

Функция запроса стоимости от API деловых линий в зависимости от введенного города:

// Ajax-запрос на стоимость доставки
add_action( 'wp_ajax_delivery_nummer', 'get_ajax_delivery_nummer' );
add_action( 'wp_ajax_nopriv_delivery_nummer', 'get_ajax_delivery_nummer' );

function get_ajax_delivery_nummer() {
	
	if ( !empty($_POST['delivery']) ){		
	
		global $woocommerce;
		$weight = $woocommerce->cart->cart_contents_weight;

		$code = $_POST['delivery'];
		$code .= "000000000000"; // добавляем недостающие нули

		$data = array(
			"appKey" => "51370440-F976-4615-AB68-4DC272FE2712", // ключ пользователя ДЛ (не коммерческий)
			"derivalPoint" => "6100000100000000000000000", //город отправления (Ростов-на-Дону)
			"derivalDoor" => true, //доставка от дверей (в пределах города Ростов-на-Дону)
			"arrivalPoint" => "{$code}", //доставка до города
			"arrivalDoor" => 1, //$check, //доставка до дверей (в пределах выбранного города)
			"sizedVolume" => "0.2", //объем по умолчанию
			"sizedWeight" => $weight //вес
		);
		$json = json_encode($data);
		$url = ('https://api.dellin.ru/v1/public/calculator.json');
		$ch = curl_init($url);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$result = curl_exec($ch);
		$obj = json_decode($result);
		curl_close($ch);

		$stoimost = ($obj->{'price'});
	
		WC()->session->set('delivery_field', $stoimost);
	}
	die();
}	


// The jQuery Ajax request
add_action( 'wp_footer', 'checkout_delivery_fields_script' );
function checkout_delivery_fields_script() {
	// Only checkout page
	if( is_checkout() && ! is_wc_endpoint_url() ):

	// Remove "is_company" custom WC session on load
	if( WC()->session->get('delivery_field') ){
		WC()->session->__unset('delivery_field');
	}
	?>
	<script type="text/javascript">
		jQuery( function($){
			var a = 'input[name=shipping_city]';

			// Ajax function
			function checkdeliveryNummer( value ){
				 $.ajax({
					type: 'POST',
					url: wc_checkout_params.ajax_url,
					data: {
						'action': 'delivery_nummer',
						//'delivery': $('input[name=shipping_city]').val(),
						'delivery': $('input[name=shipping_city]').attr('data-kladr-id'),
						//'organisation': value != '' ? 1 : 0, //для валидации text или checkbox
					},
					success: function (result) {
						$('body').trigger('update_checkout');
					}
				});
			}

			// On start
			checkdeliveryNummer($(a).val());

			// On change event
			$(a).change( function () {
				checkdeliveryNummer($(this).val());
			});
		});
	</script>
	<?php
	endif;
};

Изменяем функцию calculate_shipping

if( WC()->session->get( 'delivery_field' ) ){
	$cost = WC()->session->get( 'delivery_field' );
} else {
	$cost = 0;
}

Конечно это еще очень сырое решение, нужно много чего дорабатывать.

[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Подарок за покупку

Подарок за покупку

Изучим и рассмотрим такой инструмент продаж как подарок за покупку. Вариантов такого поощрения может быть масса: подарок при покупке конкретного товара (из конкретной категории), подарок при наборе в корзине определенной Читать далее »

Upgrade WC

Upgrade WC

Очередная серия улучшений (upgrade) плагина WC. Буду добавлять по мере изучения новые решения. Поиск по SKU (артикулу) Из коробки WC не ищет по артикулам (SKU). Но достаточно установить плагин Search Читать далее »

/
Групповой товар Woocommerce

Групповой товар Woocommerce

Групповой товар в Woocommerce это объединение в одной карточке нескольких товаров. Причем зайдя в карточку можно приобрести каждый товар по отдельности это по сути не правильно. Зачем нужен такой вид Читать далее »

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

Notice: Функция WP_Styles::add вызвана неправильно. Стиль с дескриптором "editor-buttons" был поставлен в очередь с незарегистрированными зависимостями: dashicons. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 6.9.1.) in /home/t/tiberi6w/opttour.ru/public_html/wp-includes/functions.php on line 6260

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

Способ доставки Деловыми линиями
Создание metabox
Рекомендации для васСоздание metaboxOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.