В этой статье мы подробно разберём, как создать калькулятор для расчёта времени работы в WordPress. Такой калькулятор полезен, если вы ведёте проектную деятельность, фриланс, или хотите автоматически рассчитывать оплачиваемое время в зависимости от заданных параметров. Примером может служить расчёт стоимости услуг на основе количества часов, дней или смен, с учётом перерывов и выходных.
Почему нужен калькулятор времени работы в WordPress
Часто владельцы сайтов и фрилансеры сталкиваются с необходимостью быстро оценивать время, затрачиваемое на выполнение задач. Ручные подсчёты занимают много времени и подвержены ошибкам. Автоматизация расчёта времени работы в WordPress позволяет:
- Ускорить процесс оценки и формирования смет;
- Снизить количество ошибок в расчетах;
- Улучшить взаимодействие с клиентами, предоставляя им мгновенную обратную связь;
- Интегрировать расчёты с другими сервисами или плагинами, например, для выставления счетов.
Основные задачи калькулятора времени работы
Калькулятор должен учитывать несколько важных параметров:
- Начало и конец работы (дата и время);
- Учёт перерывов (обед, отдых);
- Учитывать выходные и праздники, если работа не ведётся в эти дни;
- Возможность ввести фиксированную стоимость часа или дня;
- Выдавать итоговое время и итоговую стоимость услуги.
Пример плагинов для реализации задачи
Для создания такого калькулятора можно использовать готовые решения, например:
- My Popup — для отображения калькулятора в модальном окне;
- WPRemark — для интеграции отзывов и комментариев по проектам, что помогает отслеживать время;
- ABC Pagination — для удобного деления длинных форм на шаги.
Создание простого калькулятора расчёта времени в WordPress на PHP и JavaScript
Начнём с базового примера, реализующего ввод времени начала и конца, расчёт разницы и вывод результата с учётом перерыва.
HTML форма калькулятора
Добавьте на страницу следующий код формы:
<form id="wpcalc_time_form">
<label for="start_time">Время начала работы:</label>
<input type="datetime-local" id="start_time" name="start_time" required><br>
<label for="end_time">Время окончания работы:</label>
<input type="datetime-local" id="end_time" name="end_time" required><br>
<label for="break_minutes">Перерыв (минуты):</label>
<input type="number" id="break_minutes" name="break_minutes" value="0" min="0"><br>
<label for="hourly_rate">Стоимость часа (₽):</label>
<input type="number" id="hourly_rate" name="hourly_rate" value="1000" min="0" step="0.01"><br>
<button type="button" onclick="wpcalcCalculateTime()">Рассчитать</button>
</form>
<div id="wpcalc_result" style="margin-top:20px;font-weight:bold;"></div>
JavaScript для расчёта времени и стоимости
function wpcalcCalculateTime() {
const startInput = document.getElementById('start_time').value;
const endInput = document.getElementById('end_time').value;
const breakMinutes = parseInt(document.getElementById('break_minutes').value) || 0;
const hourlyRate = parseFloat(document.getElementById('hourly_rate').value) || 0;
if (!startInput || !endInput) {
alert('Пожалуйста, заполните время начала и окончания работы.');
return;
}
const startDate = new Date(startInput);
const endDate = new Date(endInput);
if (endDate <= startDate) {
alert('Время окончания должно быть больше времени начала.');
return;
}
// Общее время в миллисекундах
let diffMs = endDate - startDate;
// Вычитаем перерыв
diffMs -= breakMinutes * 60 * 1000;
if (diffMs <= 0) {
alert('Перерыв не может быть больше или равен общему времени работы.');
return;
}
// Время в часах с дробной частью
const diffHours = diffMs / (1000 * 60 * 60);
// Итоговая стоимость
const totalCost = diffHours * hourlyRate;
const resultDiv = document.getElementById('wpcalc_result');
resultDiv.innerHTML = `Общее время работы: ${diffHours.toFixed(2)} часов<br>Общая стоимость: ${totalCost.toFixed(2)} ₽`;
}
Как учитывать выходные и праздничные дни
Для более точного расчёта времени нужно исключить выходные и праздники, если работа в эти дни не ведётся. Для этого можно использовать PHP и WordPress cron, а также массивы с датами праздников.
Пример функции для исключения выходных и праздников на PHP
function wpcalcru_exclude_weekends_and_holidays($start, $end, $holidays = []) {
$current = clone $start;
$workSeconds = 0;
while ($current < $end) {
$weekday = (int) $current->format('N'); // 6 - суббота, 7 - воскресенье
$dateStr = $current->format('Y-m-d');
if ($weekday < 6 && !in_array($dateStr, $holidays)) {
$workSeconds += 86400; // добавляем день работы в секундах
}
$current->modify('+1 day');
}
return $workSeconds;
}
Эту функцию можно интегрировать в серверную часть расчётов, чтобы учитывать только рабочие дни.
Интеграция с REST API для удалённого вычисления
Если расчёты становятся сложными, логично вынести их на сервер через REST API WordPress. Клиент отправляет данные, сервер возвращает результат.
Пример регистрации эндпойнта и обработчика в functions.php
add_action('rest_api_init', function () {
register_rest_route('wpcalc/v1', '/calculate-time', [
'methods' => 'POST',
'callback' => 'wpcalcru_rest_calculate_time',
'permission_callback' => '__return_true',
]);
});
function wpcalcru_rest_calculate_time(WP_REST_Request $request) {
$start = $request->get_param('start');
$end = $request->get_param('end');
$break = (int) $request->get_param('break');
$rate = (float) $request->get_param('rate');
$startDate = new DateTime($start);
$endDate = new DateTime($end);
if ($endDate <= $startDate) {
return new WP_Error('invalid_time', 'Время окончания должно быть больше времени начала', ['status' => 400]);
}
$diff = $endDate->getTimestamp() - $startDate->getTimestamp();
$diff -= $break * 60;
if ($diff <= 0) {
return new WP_Error('invalid_break', 'Перерыв не может превышать или равняться времени работы', ['status' => 400]);
}
$hours = $diff / 3600;
$cost = $hours * $rate;
return [
'work_hours' => round($hours, 2),
'total_cost' => round($cost, 2),
];
}
Выводы и рекомендации
Создание калькулятора расчёта времени работы в WordPress — задача, решаемая с помощью комбинации HTML-форм, JavaScript и PHP. Для базового функционала достаточно клиентской части, но для учёта рабочих дней и сложной логики лучше использовать серверные вычисления и REST API. Готовые плагины из WPSHOP помогут ускорить разработку и добавить дополнительные возможности.