Вопрос или проблема
Я использую этот код для создания уведомления по электронной почте для издателей продуктов, чтобы они получали это уведомление каждый раз, когда создается новый заказ на продукты, которые они опубликовали.
Я хочу улучшить этот код, чтобы он работал, когда есть новый заказ, и когда этот заказ переходит в статус ожидания, отмены, чтобы они получали это уведомление. Как это сделать? Спасибо! Вот код
// Утилитная функция: отправить электронное письмо издателю продукта из элемента заказа
function send_email_to_product_publisher( $item, $order ) {
$product_id = $item->get_product_id();
$product = wc_get_product($product_id);
$author_id = get_post_field('post_author', $product_id);
$author = get_userdata($author_id);
if ($author_email = $author->user_email) {
$subject="Вы только что получили новый заказ!";
$product_price = wc_price($product->get_price()); // Получить форматированную цену продукта
$categories = wp_get_post_terms($product_id, 'product_cat', array("fields" => "names"));
$destinations = wp_get_post_terms($product_id, 'diem_den', array("fields" => "names"));
$categories_list = implode(', ', $categories);
$destination_list = implode(', ', $destinations);
$customer_phone = $order->get_billing_phone(); // Получить номер телефона из информации о платеже
$customer_notes = $order->get_customer_note(); // Получить примечания клиента из заказа
$quantity = $item->get_quantity(); // Получить количество продукта
$total_price = wc_price($item->get_total()); // Получить общую стоимость продукта
$message = "Здравствуйте <strong>{$author->display_name}</strong>,<br><br>";
$message .= "Вы только что получили новый заказ на Vicar.vn!<br>";
$message .= "<strong>Номер заказа:</strong> " . $order->get_order_number() . "<br>";
$message .= "<strong>Цена/место:</strong> " . $product_price . "<br>";
$message .= "<strong>Количество людей:</strong> " . $quantity . "<br>"; // Добавить количество в электронное письмо
$message .= "<strong>Общая сумма:</strong> " . $total_price . "<br>"; // Добавить общую сумму в электронное письмо
$message .= "Отправление из: <strong>" . $categories_list . "</strong><br>";
$message .= "Пункт назначения: <strong>" . $destination_list . "</strong><br>";
$message .= "<strong>Телефон клиента:</strong> <a href="https://wordpress.stackexchange.com/questions/427582/tel:" . $customer_phone . "">" . $customer_phone . "</a><br>";
$message .= "<strong>Дата поездки:</strong> " . $customer_notes . "<br>"; // Добавить примечания клиента в электронное письмо
$message .= "<strong>Ссылка для управления заказом:</strong> <a href="https://vicar.vn/don-dat-xe">Управление заказом</a><br><br>";
$message .= "Спасибо, что внесли свой вклад в потрясающее путешествие для сообщества Vicar.vn!";
$headers = "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= 'From: ' . get_bloginfo('admin_email') . "\r\n";
wp_mail($author_email, $subject, $message, $headers);
}
}
// Отправить электронное письмо связанным издателям продуктов из заказа при новом заказе
function send_email_to_product_publisher_on_new_order( $order_id, $order = false ) {
if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
$order = wc_get_order( $order_id );
}
// Убедитесь, что заказ полностью обработан перед отправкой электронных писем
if ( $order && 'processing' === $order->get_status() && ! $order->get_meta('_new_order_email_sent_to_product_publishers') ) {
foreach( $order->get_items() as $item ) {
send_email_to_product_publisher( $item, $order );
}
$order->update_meta_data( '_new_order_email_sent_to_product_publishers', '1' );
$order->save();
}
}
// Настройте приоритет вызовов или используйте конкретное действие, которое выполняется после полной обработки заказа
add_action( 'woocommerce_order_status_processing', 'send_email_to_product_publisher_on_new_order', 20, 2 );
Ответ или решение
Чтобы создать эффективную систему уведомлений по электронной почте для издателей продуктов о новых заказах, вам необходимо улучшить свой существующий код таким образом, чтобы уведомления отправлялись не только при создании нового заказа, но и при его изменении статуса на «удержание» или «отмена». Ниже представлено подробное описание подхода к реализации этого процесса.
1. Общая структура кода
Сначала давайте рассмотрим структуру вашего кода, в котором уже есть реализация отправки уведомлений при создании нового заказа. Мы будем использовать аналогичную логику для обработки статусов «удержание» и «отмена».
2. Обновленный код
Ниже представлен пример кода с учетом новых условий для отправки уведомлений:
// Utility function: Send an email to a product publisher from an order item
function send_email_to_product_publisher( $item, $order, $status ) {
$product_id = $item->get_product_id();
$product = wc_get_product($product_id);
$author_id = get_post_field('post_author', $product_id);
$author = get_userdata($author_id);
if ($author_email = $author->user_email) {
$subject = "Уведомление о заказе от Vicar.vn";
// Формирование сообщения
$message = "Здравствуйте <strong>{$author->display_name}</strong>,<br><br>";
$message .= "Ваш продукт получил обновление статуса заказа!<br>";
$message .= "<strong>Код заказа:</strong> " . $order->get_order_number() . "<br>";
$message .= "<strong>Статус заказа:</strong> " . ucfirst($status) . "<br>";
// Подробная информация о заказе
$message .= "<strong>Цена/место:</strong> " . wc_price($product->get_price()) . "<br>";
$message .= "<strong>Количество:</strong> " . $item->get_quantity() . "<br>";
$message .= "<strong>Общая сумма:</strong> " . wc_price($item->get_total()) . "<br>";
// Дополнительная информация
// ...
$headers = "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= 'From: ' . get_bloginfo('admin_email') . "\r\n";
wp_mail($author_email, $subject, $message, $headers);
}
}
// Основная функция для отправки уведомлений
function send_email_to_product_publishers_on_order_update( $order_id, $old_status, $new_status ) {
if ( !$order_id ) return;
$order = wc_get_order( $order_id );
if ( $order ) {
foreach( $order->get_items() as $item ) {
// Отправляем уведомления на основе статуса
if ($new_status === 'processing' && $old_status !== 'processing') {
send_email_to_product_publisher( $item, $order, $new_status );
} elseif ($new_status === 'on-hold' || $new_status === 'cancelled') {
send_email_to_product_publisher( $item, $order, $new_status );
}
}
}
}
// Привязка функции к хукам WooCommerce
add_action( 'woocommerce_order_status_changed', 'send_email_to_product_publishers_on_order_update', 10, 3 );
3. Объяснение кода
- Функция
send_email_to_product_publisher
: Эта функция теперь принимает дополнительный параметр$status
, который обозначает статус заказа. Сообщение изменяется в зависимости от текущего статуса. - Функция
send_email_to_product_publishers_on_order_update
: Эта функция будет вызываться при изменении статуса заказа. Она проверяет, какой был старый статус и какой установлен новый, и вызывает функцию отправки уведомлений соответственно. - Хуки: Используйте хук
woocommerce_order_status_changed
, чтобы отслеживать изменения статуса заказа.
4. Завершение
Убедитесь, что после применения изменений протестируете систему уведомлений, чтобы гарантировать, что все функции работают должным образом. Этот подход значительно улучшит коммуникацию с издателями продуктов, обновляя их о состоянии заказов и позволяя им оставаться в курсе событий.