
Готовая функция для отправки уведомлений в Telegram о новых заказах WooCommerce.
Перед использованием необходимо:
Функция автоматически отправляет детализированное сообщение в Telegram при поступлении нового заказа, включая номер заказа, дату, статус, сумму, данные клиента, список товаров, стоимость доставки и использованные купоны.
/**
* Функция отправки уведомлений в Telegram о новых заказах в WooCommerce
*
* Эта функция автоматически отправляет сообщение в Telegram при создании нового заказа в WooCommerce.
* Она использует Telegram Bot API для отправки сообщений.
*
*/
// Хук на создание нового заказа в WooCommerce
add_action('woocommerce_new_order', 'send_telegram_notification', 10, 2);
/**
* Функция отправки уведомления в Telegram
*
* @param int $order_id ID заказа
* @return void
*/
function send_telegram_notification($order_id, $order) {
// Проверяем, существует ли заказ
if (!$order_id) {
return;
}
// Проверяем, что заказ существует
if (!$order) {
return;
}
// --- НАСТРОЙКИ ---
// Замените на токен вашего Telegram бота
$telegram_token = 'YOUR_TELEGRAM_BOT_TOKEN';
// Замените на ваш chat_id
$chat_id = 'YOUR_CHAT_ID';
// URL для отправки сообщений через Telegram Bot API
$url = "https://api.telegram.org/bot" . $telegram_token . "/sendMessage";
// --- КОНЕЦ НАСТРОЕК ---
// Получаем данные заказа
$order_number = $order->get_order_number(); // Номер заказа
$order_date = $order->get_date_created()->format('d.m.Y H:i'); // Дата создания
$order_status = wc_get_order_status_name($order->get_status()); // Статус заказа
$order_total = strip_tags($order->get_total()); // Общая сумма без HTML
// Получаем данные клиента
$billing_first_name = $order->get_billing_first_name(); // Имя
$billing_last_name = $order->get_billing_last_name(); // Фамилия
$billing_phone = $order->get_billing_phone(); // Телефон
$billing_email = $order->get_billing_email(); // Email
$billing_address = $order->get_formatted_billing_address(); // Адрес доставки
// Формируем сообщение
$message = "*НОВЫЙ ЗАКАЗ* \n\n";
$message .= "*Номер заказа:* #{$order_number} \n";
$message .= "*Дата:* {$order_date} \n";
$message .= "*Статус:* {$order_status} \n";
$message .= "*Сумма:* {$order_total} \n\n";
$message .= "*КЛИЕНТ* \n";
$message .= "*Имя:* {$billing_first_name} {$billing_last_name} \n";
$message .= "*Телефон:* {$billing_phone} \n";
$message .= "*Email:* {$billing_email} \n";
$message .= "*Адрес:* {$billing_address} \n\n";
// Формируем содержимое заказа
$message .= "*СОДЕРЖИМОЕ ЗАКАЗА* \n";
$items_message = "";
foreach ($order->get_items() as $item_id => $item) {
$product_name = $item->get_name(); // Название товара
$quantity = $item->get_quantity(); // Количество
$line_total = $order->get_item_total($item, false, true); // Сумма за позицию без HTML
//Получаем цену за единицу без HTML
$unit_price = $order->get_item_subtotal($item, false, false);
$items_message .= "\u{2022} {$product_name} \n";
$items_message .= " ×{$quantity} × " . strip_tags($unit_price) . " = " . strip_tags($line_total) * $quantity . " \n";
}
$message .= $items_message;
// Добавляем стоимость доставки, если есть
if ($order->get_shipping_total() > 0) {
$message .= "\n*Доставка:* " . $order->get_shipping_method() . " \n";
$message .= "*Стоимость доставки:* " . strip_tags(wc_price($order->get_shipping_total())) . " \n";
}
// Добавляем купоны, если использовались
$coupons = $order->get_items('coupon');
if (!empty($coupons)) {
$message .= "\n*КУПОНЫ* \n";
foreach ($coupons as $coupon) {
$message .= "\u{2022} Купон: {$coupon->get_name()} (-" . strip_tags(wc_price($coupon->get_discount())) . ") \n";
}
}
// Добавляем общую сумму (на случай если отличается из-за скидок)
$message .= "\n*ИТОГО:* " . strip_tags($order->get_total()) . " \n";
// Не используем urlencode, так как используем wp_remote_post с массивом данных
// $message остается в оригинальном виде для корректного отображения кириллицы
// Формируем данные для отправки
$data = array(
'chat_id' => $chat_id,
'text' => $message,
'parse_mode' => 'Markdown', // Используем Markdown для форматирования
'disable_web_page_preview' => true // Отключаем превью ссылок
);
// Отправляем POST запрос через wp_remote_post
$response = wp_remote_post($url, array(
'body' => $data,
'timeout' => 30
));
// Проверяем результат отправки (опционально)
if (is_wp_error($response)) {
error_log('Telegram notification failed: ' . $response->get_error_message());
} else {
error_log('Telegram notification sent successfully for order #' . $order_id);
}
}add_action('woocommerce_order_status_changed', 'send_telegram_status_change', 10, 4);
function send_telegram_status_change($order_id, $from_status, $to_status, $order) {
if (!$order_id) return;
if (!$order) return;
$telegram_token = 'YOUR_TELEGRAM_BOT_TOKEN';
$chat_id = 'YOUR_CHAT_ID';
$url = "https://api.telegram.org/bot" . $telegram_token . "/sendMessage";
$message = "*ИЗМЕНЕНИЕ СТАТУСА ЗАКАЗА* \n\n";
$message .= "*Номер заказа:* #{$order->get_order_number()} \n";
$message .= "*Статус:* {$from_status} → {$to_status} \n";
$message .= "*Сумма:* {$order->get_formatted_order_total()} \n";
$data = array(
'chat_id' => $chat_id,
'text' => $message,
'parse_mode' => 'Markdown', // Используем Markdown для форматирования
'disable_web_page_preview' => true // Отключаем превью ссылок
);
$response = wp_remote_post($url, array(
'body' => $data,
'timeout' => 30
));
}
Подскажите пожалуйста, можно ли на хуке init фильтровать по IP адресу пользователей? Я в том плане, на момент срабатывания хука, запросов в базу еще не было? Или возможно лучше фильтровать их каким то другим способом, на более ранних хуках?
yguvuvuv