Изначально WooCommerce имеет ряд стандартных уведомлений, которые отправляются на почту клиента или администратора в зависимости от того, какой статус получает заказ, но бывают случаи, когда нужно реализовать отправку уведомлений, которое не предусмотрено системой.
Работая с разными платёжными шлюзами, я столкнулся с одной ошибкой, которая появлялась у СберБанка и Тинькофф. В частности ошибка касается виртуальных и скачиваемых товаров, для которых статус сразу устанавливается на "Выполнен" и клиент получает свой заказ, не дожидаясь обработки. Так вот, иногда оплаченные заказы после получения статуса "Выполнен" могли сменить статус на "Не удался" или "На удержании", что в итоге доставляло клиентам проблемы при скачивании и они обращались в службу поддержки.
Чтобы такие случаи быстро отслеживать и проверять, ещё до того как клиент напишет в поддержку, я нашёл решение в отправке уведомлений на почту администратора, когда выполненный заказ менял свой статус. Собственно код представляю ниже с пояснениями. Чтобы он работал нужно вставить код в файл functions.php вашей темы.
add_action( 'woocommerce_order_status_changed', 'wpgid_email_complated_to_faled', 10, 4 );
function wpgid_email_complated_to_faled( $id, $status_transition_from, $status_transition_to, $that ){
// проверяем изначальный статус заказа (если он был "completed", то выполняем функцию)
if( $status_transition_from === 'completed' ) {
$name = 'Название вашего сайта'; // Имя от кого будет приходить письмо
$mail_from = 'wordpress@you-domain.ru'; // Почта от кого будет приходить письмо
$mail_to = 'wordpress@you-domain.ru'; // Почта для ответа на письмо
$admin_email = get_option('admin_email'); // Email администратора
// Проверяем новый статус заказа и присваиваем ему текстовое значение
switch ($status_transition_to) {
case 'failed':
$status = 'Не удался';
break;
case 'pending':
$status = 'В ожидании оплаты';
break;
case 'processing':
$status = 'Обработка';
break;
case 'on-hold':
$status = 'На удержании';
break;
case 'cancelled':
$status = 'Отменен';
break;
case 'refunded':
$status = 'Возвращен';
break;
}
$subject = 'Заказ №'. $id .' изменил статус с "Выполнен" на "'. $status .'"'; // Тема письма
$body = 'Заказ №'. $id .' изменил статус с "Выполнен" на "'. $status .'"'; // Сообщение
$headers = 'From: '.$name.' <'.$mail_from.'>' . "\r\n" . 'Reply-To: ' . $mail_to; // Заголовки
wp_mail( $admin_email, $subject, $body, $headers ); // Функция отправки письма
}
}