Я создал пользовательский статус заказа в моей WooCommerce под названием Back Order ( wc-backorder
):
/** * Add custom status to order list */ add_action( 'init', 'register_custom_post_status', 10 ); function register_custom_post_status() { register_post_status( 'wc-backorder', array( 'label' => _x( 'Back Order', '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( 'Back Order <span class="count">(%s)</span>', 'Back Order <span class="count">(%s)</span>', 'woocommerce' ) ) ); } /** * Add custom status to order page drop down */ add_filter( 'wc_order_statuses', 'custom_wc_order_statuses' ); function custom_wc_order_statuses( $order_statuses ) { $order_statuses['wc-backorder'] = _x( 'Back Order', 'Order status', 'woocommerce' ); return $order_statuses; }
Теперь я хочу получать электронное письмо всякий раз, когда получен заказ, которому была дана котировка статуса. Я создал плагин на основе этой полезной статьи: Как добавить пользовательскую электронную почту WooCommerce
Эта ссылка содержит мой исходный код плагина и код functions.php.
Я добавил hook.fp:
add_action( 'woocommerce_order_status_wc-order-confirmed', array( WC(), 'send_transactional_email' ), 10, 10 ); function so_27112461_woocommerce_email_actions( $actions ){ $actions[] = 'woocommerce_order_status_wc-order-confirmed'; return $actions; } add_filter( 'woocommerce_email_actions', 'so_27112461_woocommerce_email_actions' );
Ничего не происходит, когда заказ переходит в статус «Обратный порядок».
Есть идеи?
Я пробовал загрузки разных крючков, но я не могу заставить запускать триггерную функцию.
Я нахожусь в последних версиях WordPress и WooCommerce (3.0+)
благодаря
– EDIT / UPDATE –
Поскольку учебный код, который вы используете, действительно устарел (2013) для этой новой мега-версии версии 3.0+, эта пользовательская функция, подключенная в woocommerce_order_status_changed
будет выполнять эту работу. Таким образом, вы сможете отправить настраиваемое уведомление по электронной почте для обработки, когда статус заказа будет изменен на ваш пользовательский статус.
Вот, что рабочий и проверенный код для WC 3.0+:
add_action('woocommerce_order_status_changed', 'backorder_status_custom_notification', 10, 4); function backorder_status_custom_notification( $order_id, $from_status, $to_status, $order ) { if( $order->has_status( 'backorder' )) { // Getting all WC_emails objects $email_notifications = WC()->mailer()->get_emails(); // Customizing Heading and subject In the WC_email processing Order object $email_notifications['WC_Email_Customer_Processing_Order']->heading = __('Your processing Back order','woocommerce'); $email_notifications['WC_Email_Customer_Processing_Order']->subject = 'Your {site_title} processing Back order receipt from {order_date}'; // Sending the customized email $email_notifications['WC_Email_Customer_Processing_Order']->trigger( $order_id ); } }
Этот код находится в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
КАК ваш пользовательский статус является wc-backorder
, но не wc-order-confirmed
, вам просто нужно заменить всюду wc-order-confirmed
wc-backorder
.
Чтобы заставить его работать, вам придется изменить две последние подключенные функции следующим образом:
add_action( 'woocommerce_order_status_wc-backorder', array( WC(), 'send_transactional_email' ), 10, 1 ); add_filter( 'woocommerce_email_actions', 'filter_woocommerce_email_actions' ); function filter_woocommerce_email_actions( $actions ){ $actions[] = 'woocommerce_order_status_wc-backorder'; return $actions; }
Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
Это должно работать (я не могу проверить его, так как нет кода вашего настраиваемого плагина) .
Исходный код ссылки: woocommerce_order_status_{$this->status_transition[to]}
action hook
add_action("woocommerce_order_status_changed", "my_custom_notification"); function my_custom_notification($order_id, $checkout=null) { global $woocommerce; $order = new WC_Order( $order_id ); if($order->status === 'backorder' ) { // Create a mailer $mailer = $woocommerce->mailer(); $message_body = __( 'Hello world!!!' ); $message = $mailer->wrap_message( // Message head and message body. sprintf( __( 'Order %s received' ), $order->get_order_number() ), $message_body ); // Cliente email, email subject and message. $mailer->send( $order->billing_email, sprintf( __( 'Order %s received' ), $order->get_order_number() ), $message ); } }
Попробуй это