Всем привет. Недавно решал задачу отправки писем с интернет-магаpина на wordpress с настроенным woocommerce. На сайте использовалась интеграция с crm системой retail crm. Задача была в том, чтобы отправлять письма о новом заказе клиенту и администратору, при этом статус заказа должен быть обязательно «В ожидании оплаты».
Как известно в woocommerce по умолчанию уведомления о таком статусе не приходят. Но если настроить присваивание статусов «В обработке» или «На удержании» новым заказам, то уведомления будут приходить на почту. Сложность заключалась в том что простым присвоением статуса новым заказам данную задачу решить нельзя было, поскольку на сайте используется crm, которая сама присваивает статусы после обработки.
Решить проблему удалось с помощью хуков в файле functions.php. Файл functions.php позволяет добавлять пользовательские функции. Располагается в папке темы по пути ../sait.ru/public_html/wp-content/themes/yourtheme/functions.php и загружается каждый раз, во время просмотра внешней части сайта.
add_action( 'woocommerce_checkout_order_processed', 'my_func', 20, 1 ); my_func( $order_id ) { $order = wc_get_order( $order_id ); //отфильтровываем только заказы в статусе "ожидание" if( ! $order->has_status( 'pending' ) ) return; $wc_email = WC()->mailer()->get_emails()['WC_Email_New_Order']; // Изменяем тему $wc_email->settings['subject'] = ('{site_title} - New customer Pending order ({order_number}) - {order_date}'); // Изменяем заголовок $wc_email->settings['heading'] = ('New customer Pending Order'); // Отправить уведомление «Новое письмо» (администратору) $wc_email->trigger( $order_id ); // Сообщение пользователю $email_heading = 'Спасибо за заказ'; $args = array( 'order' => $order, 'email_heading' => $email_heading, 'sent_to_admin' => false, 'plain_text' => false, ); $content_info = wc_get_template_html("emails/customer-processing-order.php", $args); $site_title = get_bloginfo('name'); $customer_email = $order->get_billing_email(); $email_subject = $site_title.' - Новый заказ'; wc_mail($customer_email, $email_subject, $content_info); }
Поясним что тут происходит. Добавляем хук на срабатывание от woocommerce_checkout_order_processed, вызываем нашу функцию my_func. Отфильтровываем только заявки в статусе ожидание. Устанавливаем в письме нужные нам зоголвки и отправляем методом trigger письмо администратору. После этого занимаемся отправкой письма пользователю: устанавливаем заголовки, выбираем необходимый шаблон woocommerce mail для отправки (customer-processing-order.php) получаем адрес клиента из заказа и методом wc_mail отправляем ему письмо.