Отправка письма при смене статуса заказа WooCommerce

Изначально 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 );                                 // Функция отправки письма
	}
}
Дима
С движком WordPress познакомился в 2015 году и сразу начал его осваивать. Очень понравилось копаться в коде и создавать что-то новое. Создаю темы и плагины WP в первую очередь для себя, но возможно мои наработки и куски кода кому-то пригодятся, поэтому создал этот блог.