Автоматический расчет сложных тарифов — частая задача для сайтов, предлагающих услуги с многоступенчатым ценообразованием. В WordPress такая функциональность часто нужна для калькуляторов стоимости, тарифных планов и систем бронирования. В этой статье разберем, как реализовать точный и удобный расчет сложного тарифа с помощью пользовательского PHP-кода и JavaScript, а также рассмотрим примеры плагинов для расширения возможностей.
Почему стандартные калькуляторы не всегда подходят для сложных тарифов
Простые калькуляторы в WordPress часто умеют только умножать базовую цену на количество или рассчитывать сумму по фиксированным тарифам. Но когда тариф зависит от нескольких параметров, например, объема, длительности, дополнительных опций, скидок и условий, стандартные решения оказываются слишком ограниченными.
Для таких случаев нужен кастомный код с логикой, которая учитывает все переменные и правильно комбинирует их значения. Это позволяет избежать ошибок и создавать гибкую систему расчетов, которую легко расширять и поддерживать.
Рассмотрим пример: тариф для услуги зависит от количества дней, количества участников и выбранного пакета сервиса. Цена меняется в зависимости от сочетания этих параметров.
Создание базы расчета — структура данных для тарифов
Для начала нужно определить структуру данных, которая будет хранить тарифы и правила расчета. Обычно используют массивы с вложенными условиями.
Пример структуры для нашего тарифа:
$wpcalc_calc_tariffs = [
'basic' => [
'price_per_day' => 1000,
'max_participants' => 5,
'discounts' => [
['min_days' => 5, 'discount_percent' => 10],
['min_days' => 10, 'discount_percent' => 20],
],
],
'premium' => [
'price_per_day' => 2000,
'max_participants' => 10,
'discounts' => [
['min_days' => 3, 'discount_percent' => 5],
['min_days' => 7, 'discount_percent' => 15],
],
],
];Здесь для каждого пакета указана цена за день, максимальное количество участников и массив скидок по минимальному количеству дней.
Реализация функции расчета тарифа на PHP
Теперь создадим функцию wpcalc_calculate_tariff, которая примет параметры и вернет итоговую цену с учетом скидок и ограничений.
function wpcalc_calculate_tariff($package, $days, $participants) {
global $wpcalc_calc_tariffs;
if (!isset($wpcalc_calc_tariffs[$package])) {
return 0; // Пакет не найден
}
$tariff = $wpcalc_calc_tariffs[$package];
// Проверка ограничения по участникам
if ($participants > $tariff['max_participants']) {
return 0; // Превышено макс. число участников
}
$base_price = $tariff['price_per_day'] * $days;
// Определяем максимальную скидку
$max_discount = 0;
foreach ($tariff['discounts'] as $discount) {
if ($days >= $discount['min_days'] && $discount['discount_percent'] > $max_discount) {
$max_discount = $discount['discount_percent'];
}
}
$price_after_discount = $base_price * (1 - $max_discount / 100);
// Допустим, цена увеличивается на 10% за каждого участника сверх 1
if ($participants > 1) {
$price_after_discount *= 1 + 0.1 * ($participants - 1);
}
return round($price_after_discount, 2);
}Функция учитывает выбранный пакет, количество дней и участников, применяет скидки и наценки, возвращая итоговую стоимость.
Интеграция с формой на странице и AJAX обновление результата
Чтобы пользователь видел расчет в режиме реального времени, нужно добавить форму с полями и обработчик на JavaScript, который будет отправлять данные через AJAX и получать результат.
Пример HTML формы:
<form id="wpcalc-form">
<label>Пакет:
<select name="package">
<option value="basic">Базовый</option>
<option value="premium">Премиум</option>
</select>
</label>
<label>Дней:
<input type="number" name="days" min="1" value="1" />
</label>
<label>Участников:
<input type="number" name="participants" min="1" value="1" />
</label>
<div id="wpcalc-result">Стоимость: —</div>
</form>JavaScript с использованием jQuery для отправки запроса и обновления результата:
jQuery(document).ready(function($) {
$('#wpcalc-form input, #wpcalc-form select').on('change input', function() {
var data = {
action: 'wpcalc_ajax_calculate',
package: $('#wpcalc-form select[name="package"]').val(),
days: parseInt($('#wpcalc-form input[name="days"]').val()),
participants: parseInt($('#wpcalc-form input[name="participants"]').val()),
};
$.post(wpcalc_ajax_object.ajax_url, data, function(response) {
if (response.success) {
$('#wpcalc-result').text('Стоимость: ' + response.data.price + ' ₽');
} else {
$('#wpcalc-result').text('Ошибка в расчете');
}
});
});
});На стороне PHP нужно зарегистрировать AJAX-обработчик:
add_action('wp_ajax_wpcalc_ajax_calculate', 'wpcalc_ajax_calculate_handler');
add_action('wp_ajax_nopriv_wpcalc_ajax_calculate', 'wpcalc_ajax_calculate_handler');
function wpcalc_ajax_calculate_handler() {
$package = sanitize_text_field($_POST['package'] ?? '');
$days = intval($_POST['days'] ?? 0);
$participants = intval($_POST['participants'] ?? 0);
$price = wpcalc_calculate_tariff($package, $days, $participants);
if ($price > 0) {
wp_send_json_success(['price' => $price]);
} else {
wp_send_json_error();
}
}Использование плагинов для расширения функционала расчета
Если хочется упростить создание сложных тарифов без глубокого кодирования, можно использовать плагины с поддержкой условных правил и формул. Например:
- Clearfy Pro — расширяет возможности WordPress, включая оптимизацию и дополнительные инструменты для работы с кодом и формулами.
- Expert Review — плагин для создания сложных форм и калькуляторов с возможностью гибкой настройки правил.
Оба плагина позволяют создавать сложные условия и интегрироваться с визуальными формами, что значительно сокращает время разработки.
Подведение итогов и рекомендации по доработке
Мы рассмотрели, как построить автоматический расчет сложного тарифа в WordPress с помощью кастомного PHP-кода и AJAX. Такая реализация позволяет гибко настраивать логику, быстро менять параметры и улучшать интерфейс по мере необходимости.
Для повышения удобства можно добавить:
- Валидацию формы и пользовательские уведомления.
- Кэширование результатов при повторных расчетах с одинаковыми параметрами.
- Интеграцию с WooCommerce для автоматического добавления товара с рассчитанной ценой.
- Административный интерфейс для управления тарифами без редактирования кода.
Такой подход обеспечит надежную и масштабируемую систему расчетов на вашем сайте с WordPress.