Внедряем в пользовательский способ доставки расчет стоимости Деловых линий.
Работа с 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;
}
Конечно это еще очень сырое решение, нужно много чего дорабатывать.