Задача. Нужно создать (добавить) свой (кастомный) новый статус заказа «Оплачено».
Решение 1. Добавить следующий Код №1 в functions.php
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//Создаем свой статус заказа "Оплачено" function register_my_new_order_statuses() { register_post_status( 'wc-status-name', array( 'label' => _x( 'Оплачено', 'Order status', 'textdomain' ), //Заменяем "Оплачено" на нужное 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Оплачено <span class="count">(%s)</span>', 'Оплачено <span class="count">(%s)</span>', 'textdomain' ) //Заменяем "Оплачено" на нужное ) ); } add_action( 'init', 'register_my_new_order_statuses' ); function my_new_wc_order_statuses( $order_statuses ) { $order_statuses['wc-status-name'] = _x( 'Оплачено', 'Order status', 'textdomain' ); //Заменяем "Оплачено" на нужное return $order_statuses; } add_filter( 'wc_order_statuses', 'my_new_wc_order_statuses' ); |
Решение 2. Если использовать первый код, то при смене статуса на этот кастомный не будет происходить уведомление на почту покупателя о смене статуса заказа. Чтобы при смене статуса заказа на наш пользовательский отправлялось письмо покупателю с уведомлением, можно использовать Код №2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
// Создаем свой статус заказа "Оплачено" // регистрация пользовательского статуса 'paid-order' для Заказов add_action( 'init', 'register_custom_order_status', 20 ); function register_custom_order_status() { register_post_status( 'wc-paid-order', array( 'label' => _x( 'Оплачено', 'Order status', 'woocommerce' ), 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( 'Оплачено <span class="count">(%s)</span>', 'Оплачено <span class="count">(%s)</span>', 'woocommerce' ) ) ); } // Добавление настраиваемого статуса 'paid-order' в раскрывающийся список страниц редактирования заказа add_filter( 'wc_order_statuses', 'custom_wc_order_statuses' ); function custom_wc_order_statuses( $order_statuses ) { $order_statuses['wc-paid-order'] = _x( 'Оплачено', 'Order status', 'woocommerce' ); return $order_statuses; } // Добавление пользовательского статуса 'paid-order' в выпадающий список административных заказов add_filter( 'bulk_actions-edit-shop_order', 'custom_dropdown_bulk_actions_shop_order', 20, 1 ); function custom_dropdown_bulk_actions_shop_order( $actions ) { $actions['mark_paid-order'] = __( 'Оплачено', 'woocommerce' ); return $actions; } // Добавление действия для 'paid-order' add_filter( 'woocommerce_email_actions', 'custom_email_actions', 20, 1 ); function custom_email_actions( $actions ) { $actions[] = 'woocommerce_order_status_wc-paid-order'; return $actions; } add_action( 'woocommerce_order_status_wc-paid-order', 'send_transactional_email', 10, 1 ); // Отправка уведомления по электронной почте, когда заказ получает статус «Оплачено» add_action('woocommerce_order_status_paid-order', 'awaiting_delivery_order_status_email_notification', 20, 2); function awaiting_delivery_order_status_email_notification( $order_id, $order ) { // ЗДЕСЬ под вашими настройками $heading = __('Оплачено','woocommerce'); $subject = '[{site_title}] Ваш заказ оплачен ({order_number}) - {order_date}'; // Тип уведомления по электронной почте $email_key = 'WC_Email_Customer_Processing_Order'; // Получить конкретный объект WC_emails $email_obj = WC()->mailer()->get_emails()[$email_key]; // Отправка индивидуального электронного письма $email_obj->trigger( $order_id ); } // Настройте заголовок электронной почты для этого уведомления по электронной почте о настраиваемом статусе add_filter( 'woocommerce_email_heading_customer_processing_order', 'email_heading_customer_awaiting_delivery_order', 10, 2 ); function email_heading_customer_awaiting_delivery_order( $heading, $order ){ if( $order->has_status( 'paid-order' ) ) { $email_key = 'WC_Email_Customer_Processing_Order'; // Тип уведомления по электронной почте $email_obj = WC()->mailer()->get_emails()[$email_key]; // получить конкретный WC_emails object $heading_txt = __('Оплачено','woocommerce'); // Новый текст заголовка return $email_obj->format_string( $heading_txt ); } return $heading; } // Настройте тему электронной почты для этого уведомления по электронной почте о настраиваемом статусе add_filter( 'woocommerce_email_subject_customer_processing_order', 'email_subject_customer_awaiting_delivery_order', 10, 2 ); function email_subject_customer_awaiting_delivery_order( $subject, $order ){ if( $order->has_status( 'paid-order' ) ) { $email_key = 'WC_Email_Customer_Processing_Order'; // Тип уведомления по электронной почте $email_obj = WC()->mailer()->get_emails()[$email_key]; // Получить конкретный объект WC_emails $subject_txt = sprintf( __('[%s] Ваш заказ оплачен (%s) - %s', 'woocommerce'), '{site_title}', '{order_number}', '{order_date}' ); // Текст новой темы return $email_obj->format_string( $subject_txt ); } return $subject; } // end Создаем свой статус заказа |
В Изображении 1 скриншот письма, которое пришло покупателю после смены статуса на «Оплачено» по Коду №2.
Использованы матеиалы с stackoverflow.
Это же позволяет добавить просто статус заказа. А как добавить емаил уведомление и возможность их настроить ?
Хороший вопрос. Обновил статью. Нашел решение на stackoverflow (внизу указал ссылку).
Использовал код оттуда, правда был один момент в строке
add_action( 'woocommerce_order_status_wc-awaiting-delivery', array( WC(), 'send_transactional_email' ), 10, 1 );
в ней параметрarray( WC()
выдавал ошибку при сохранении. Поэтому сделал такadd_action( 'woocommerce_order_status_wc-awaiting-delivery', 'send_transactional_email' , 10, 1 );
Код проверил, письмо пришло, с темой и заголовком как нужно было — «Оплачено».
Единственное, что не разбирался с содержанием письма, там вот старый текст, как при первом письме о получении заказа.
А как добавить 2 статуса подряд? Один получилось, на второй выдает
Похоже, что вы 2 раза одну и туже функцию объявляетеre gister_my_new_order_statuses. Попробуйте вторую функцию назвать иначе, например, register_my_new_order_statuses_2 и дополнительно ее добавить в хуки
уже пробовал — не помогло