Уведомление по электронной почте издателю продукта о новом заказе, приостановлении, отмене

Вопрос или проблема

Я использую этот код для создания уведомления по электронной почте для издателей продуктов, чтобы они получали это уведомление каждый раз, когда создается новый заказ на продукты, которые они опубликовали.

Я хочу улучшить этот код, чтобы он работал, когда есть новый заказ, и когда этот заказ переходит в статус ожидания, отмены, чтобы они получали это уведомление. Как это сделать? Спасибо! Вот код

// Утилитная функция: отправить электронное письмо издателю продукта из элемента заказа
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. Завершение

Убедитесь, что после применения изменений протестируете систему уведомлений, чтобы гарантировать, что все функции работают должным образом. Этот подход значительно улучшит коммуникацию с издателями продуктов, обновляя их о состоянии заказов и позволяя им оставаться в курсе событий.

Оцените материал
Добавить комментарий

Капча загружается...