简体   繁体   English

在交易电子邮件中使用时,Woocommerce 挂钩自定义状态更改不会触发

[英]Woocommerce hook on custom status change wont trigger when used in trannsactional email

I am unable to get transactional email on status change.我无法收到有关状态更改的交易电子邮件。 I have custom statuses and custom emails set on woo commerce plugin I programmed to my needs.我在根据需要编程的 woo 商务插件上设置了自定义状态和自定义电子邮件。

The code follows same logic as for ootb transactional emails described here该代码遵循与此处描述的 ootb 交易电子邮件相同的逻辑

<?php
/*
Plugin Name:  WooCommerce Custom Statuses

*/




if (!defined('ABSPATH')) {
    return;
}


/**
 * Class Custom_WC_Email
 */
class WC_LR_custom_order_statuses
{

    /**
     * Custom_WC_Email constructor.
     */
    public function __construct()
    {
        // Filtering the emails and adding our own email.
        add_filter('woocommerce_email_classes', array($this, 'lr_register_emails'), 10, 1);
        add_filter('woocommerce_register_shop_order_post_statuses', [$this, 'lr_register_statuses'], 10, 1);
        add_filter('wc_order_statuses', [$this, 'lr_custom_wc_order_statuses']);
        add_filter('bulk_actions-edit-shop_order', [$this, 'lr_custom_dropdown_bulk_actions_shop_order'], 20, 1);

        foreach (['post', 'shop_order'] as $hook)
            add_filter("views_edit-$hook", [$this, 'lr_shop_order_modified_views']);


        add_action('admin_head', [$this, 'lr_change_order_processing_row_color']);
        //add_action('init', [$this, 'register_statuses']);




        // add_action( 'add_meta_boxes', [$this,'littlerug_add_custom_box'] );
        // add_action( 'save_post', [$this,'littlerug_save_postdata'], 1, 2 );


        // Absolute path to the plugin folder.
        define('CUSTOM_WC_EMAIL_PATH', plugin_dir_path(__FILE__));
    }
    function lr_shop_order_modified_views($views)
    {
        // if( isset( $views['wc-completed'] ) )
        //     $views['wc-completed'] = str_replace( 'Completed', __( 'Order Received', 'woocommerce'), $views['wc-completed'] );

        if (isset($views['wc-processing']))
            $views['wc-processing'] = str_replace('Spracováva sa', 'Čakajúce na platbu', $views['wc-processing']);

        if (isset($views['wc-on-hold'])) {
            if (preg_match('/Čaká/', $views['wc-on-hold']))
                $views['wc-on-hold'] = str_replace('Čaká', 'Prijatá', $views['wc-on-hold']);
            else
                $views['wc-on-hold'] = str_replace('Čakajúce', 'Prijaté', $views['wc-on-hold']);
        }
        // if( isset( $views['wc-pending'] ) )
        //     $views['wc-pending'] = str_replace( 'Pending', __( 'Stucked', 'woocommerce'), $views['wc-pending'] );

        return $views;
    }
    function lr_custom_dropdown_bulk_actions_shop_order($actions)
    {
        unset($actions['mark_processing']);
        unset($actions['mark_pending']);
        unset($actions['mark_cancelled']);
        unset($actions['mark_completed']);

        $actions['mark_on-hold']    = 'Zmeniť stav na "Prijatá"';
        $actions['mark_order-confirmed']    = 'Zmeniť stav na "Potvrdená"';
        $actions['mark_payment-await'] = 'Zmeniť stav na "Čaká na platbu"';
        $actions['mark_payment-received']    = 'Zmeniť stav na "Platba prijatá"';
        $actions['mark_order-shipped']    = 'Zmeniť stav na "Odoslaná"';
        $actions['mark_completed']    = 'Zmeniť stav na "Vybavená"';
        $actions['mark_order-done']    = 'Zmeniť stav na "Hotová"';
        $actions['mark_cancelled'] = 'Zmeniť stav na "Zrušená"';

        return $actions;
    }
    function lr_change_order_processing_row_color()
    {

        echo sprintf(
            '
            <style type="text/css">
                .order-status.status-order-shipped {
                    background: #c8d7e1;
                    color: #2e4453;
                }
                .order-status.status-order-confirmed {
                    background: #edc77a;
                    color: #a36e03;
                }
                .order-status.status-payment-received {
                    background: #8cd98c;
                    color: #507418;
                }
                .order-status.status-order-done {
                    background: #fdfd96;
                    color: #8f8f12;
                }.order-status.status-payment-await {
                    background: #c6e1c6;
                    color: #5b841b;
                }
            </style>'
        );
    }
    function lr_custom_wc_order_statuses($order_statuses)
    {
        //change default status names add new
        unset($order_statuses['wc-processing']);
        unset($order_statuses['wc-pending']);
        unset($order_statuses['wc-completed']);
        unset($order_statuses['wc-cancelled']);
        unset($order_statuses['wc-refunded']);
        unset($order_statuses['wc-failed']);

        $order_statuses['wc-on-hold'] = _x('Prijatá', 'woocommerce');
        $order_statuses['wc-order-confirmed'] = _x('Potvrdená', 'Order status', 'woocommerce');
        $order_statuses['wc-payment-await'] = _x('Čaká na platbu', 'woocommerce');
        $order_statuses['wc-payment-received'] = _x('Platba prijatá', 'Order status', 'woocommerce');
        $order_statuses['wc-order-shipped'] = _x('Odoslaná', 'Order status', 'woocommerce');
        $order_statuses['wc-completed'] = _x('Vybavená', 'Order status', 'woocommerce');
        $order_statuses['wc-order-done'] = _x('Hotová', 'Order status', 'woocommerce');
        $order_statuses['wc-cancelled'] = _x('Zrušená', 'Order status', 'woocommerce');
        $order_statuses['wc-refunded'] = _x('Refundovaná', 'Order status', 'woocommerce');

        return $order_statuses;
    }
    /**
     * @param array $emails
     *
     * @return array
     */
    public function lr_register_emails($emails)


    {

        $emails['WC_Customer_Cancel_Order'] = include __DIR__ . '/emails/class-wc-customer-cancel-order.php';
        $emails['WC_Customer_Payment_Received'] =  include __DIR__ . '/emails/class-wc-customer-payment-received.php';
        $emails['WC_Customer_Order_Shipped'] =  include __DIR__ . '/emails/class-wc-customer-order-shipped.php';
        $emails['WC_Customer_Order_Confirmed'] =  include __DIR__ . '/emails/class-wc-customer-order-confirmed.php';
        $emails['WC_Customer_Payment_Await'] =  include __DIR__ . '/emails/class-wc-customer-payment-await.php';
        //customer_processing_order
        // $emails['WC_Customer_Order_Placed'] = new WC_Customer_Order_Placed();
        return $emails;
    }
    public function lr_register_statuses($order_statuses)
    {
        // Status must start with "wc-"
        $order_statuses['wc-payment-await'] = array(
            'label'                     => 'Čaká na platbu', //_x( 'Back Order', 'Order status', 'woocommerce' ),
            'public'                    => false,
            'exclude_from_search'       => false,
            'show_in_admin_all_list'    => true,
            'show_in_admin_status_list' => true,
            'label_count'               => _n_noop('Čaká na platbu <span class="count">(%s)</span>', 'Čaká na platbu <span class="count">(%s)</span>', 'woocommerce') //_n_noop( 'Back Order <span class="count">(%s)</span>', 'Back Order <span class="count">(%s)</span>', 'woocommerce' )
        );
        $order_statuses['wc-payment-received'] =  array(
            'label'                     => 'Platba prijatá', //_x( 'Back Order', 'Order status', 'woocommerce' ),
            'public'                    => false,
            'exclude_from_search'       => false,
            'show_in_admin_all_list'    => true,
            'show_in_admin_status_list' => true,
            'label_count'               => _n_noop('Platba prijatá <span class="count">(%s)</span>', 'Platieb prijatých <span class="count">(%s)</span>', 'woocommerce') //_n_noop( 'Back Order <span class="count">(%s)</span>', 'Back Order <span class="count">(%s)</span>', 'woocommerce' )
        );
        $order_statuses['wc-order-shipped'] =  array(
            'label'                     => 'Odoslaná', //_x( 'Back Order', 'Order status', 'woocommerce' ),
            'public'                    => false,
            'exclude_from_search'       => false,
            'show_in_admin_all_list'    => true,
            'show_in_admin_status_list' => true,
            'label_count'               => _n_noop('Odoslaná <span class="count">(%s)</span>', 'Odoslané <span class="count">(%s)</span>', 'woocommerce') //_n_noop( 'Back Order <span class="count">(%s)</span>', 'Back Order <span class="count">(%s)</span>', 'woocommerce' )
        );
        $order_statuses['wc-order-confirmed'] = array(
            'label'                     => 'Potvrdená', //_x( 'Back Order', 'Order status', 'woocommerce' ),
            'public'                    => false,
            'exclude_from_search'       => false,
            'show_in_admin_all_list'    => true,
            'show_in_admin_status_list' => true,
            'label_count'               => _n_noop('Potvrdená <span class="count">(%s)</span>', 'Potvrdené <span class="count">(%s)</span>', 'woocommerce') //_n_noop( 'Back Order <span class="count">(%s)</span>', 'Back Order <span class="count">(%s)</span>', 'woocommerce' )
        );
        $order_statuses['wc-order-done'] = array(
            'label'                     => 'Hotová', //_x( 'Back Order', 'Order status', 'woocommerce' ),
            'public'                    => false,
            'exclude_from_search'       => false,
            'show_in_admin_all_list'    => true,
            'show_in_admin_status_list' => true,
            'label_count'               => _n_noop('Hotová <span class="count">(%s)</span>', 'Hotové <span class="count">(%s)</span>', 'woocommerce') //_n_noop( 'Back Order <span class="count">(%s)</span>', 'Back Order <span class="count">(%s)</span>', 'woocommerce' )
        );

        return $order_statuses;
    }
}

new WC_LR_custom_order_statuses();

Same issue was described here but I am doing it correctly with the statuses not using wc- prefix 此处描述了相同的问题,但我在未使用 wc- 前缀的状态下正确地执行了此操作

Any advice how to debug this issue would be highly appreciated.任何有关如何调试此问题的建议将不胜感激。

Found out that I needed to add email actions.发现我需要添加电子邮件操作。 No idea why, did not see any documentation around this but this was the breaking point:)不知道为什么,没有看到任何关于此的文档,但这是突破点:)

 add_filter('woocommerce_email_actions', [$this, 'filter_woocommerce_email_actions'], 10, 1);

function filter_woocommerce_email_actions($actions)
{
    $actions[] = 'woocommerce_order_status_confirmed';
    $actions[] = 'woocommerce_order_status_payment-await';
    $actions[] = 'woocommerce_order_status_payment-received';
    $actions[] = 'woocommerce_order_status_shipped';
    $actions[] = 'woocommerce_order_status_on-hold_to_cancelled';
    return $actions;
}

After the extended email with the action hook names same as above started to trigger and email was sent successfully.在具有与上面相同的操作挂钩名称的扩展电子邮件开始触发并成功发送电子邮件后。

I'm trying to do something very similar and have added that last step you mentioned but I'm still having no luck unfortunately.我正在尝试做一些非常相似的事情,并添加了你提到的最后一步,但不幸的是我仍然没有运气。

Initial class:初始类:

<?php
/**
 * @author BAKKBONE Australia
 * @package Bkf_WC_Email
 * @license GNU General Public License (GPL) 3.0
**/

if ( ! defined( 'ABSPATH' ) ) {
    return;
}

/**
 * Class Bkf_WC_Email
 */
class Bkf_WC_Email {

    /**
     * Bkf_WC_Email constructor.
     */
    public function __construct() {
        add_action( 'woocommerce_email_classes', array( $this, 'bkf_register_email' ), 90, 1 );
        define( 'CUSTOM_WC_EMAIL_PATH', plugin_dir_path( __FILE__ ) );
        add_filter('woocommerce_email_actions', array($this, 'bkf_woocommerce_email_actions'), 10, 1);
    }

    /**
     * @param array $emails
     *
     * @return array
     */
    public function bkf_register_email( $emails ) {
        $emails['WC_Email_Customer_Scheduled_Order'] = include __DIR__ . 'emails/class-wc-customer-scheduled-order.php';
        $emails['WC_Email_Customer_Prepared_Order'] = include __DIR__ . 'emails/class-wc-customer-made-order.php';
        $emails['WC_Email_Customer_Out_for_Delivery_Order'] = include __DIR__ . 'emails/class-wc-customer-out-order.php';

        return $emails;
    }

    public function filter_woocommerce_email_actions($actions)
    {
$actions[] = 'woocommerce_order_status_scheduled';
$actions[] = 'woocommerce_order_status_made';
$actions[] = 'woocommerce_order_status_out';
$actions[] = 'woocommerce_order_status_relay';
$actions[] = 'woocommerce_order_status_processing';
$actions[] = 'woocommerce_order_status_completed';
$actions[] = 'woocommerce_order_status_scheduled_to_made';
$actions[] = 'woocommerce_order_status_scheduled_to_out';
$actions[] = 'woocommerce_order_status_scheduled_to_relay';
$actions[] = 'woocommerce_order_status_scheduled_to_processing';
$actions[] = 'woocommerce_order_status_scheduled_to_completed';
$actions[] = 'woocommerce_order_status_made_to_scheduled';
$actions[] = 'woocommerce_order_status_made_to_out';
$actions[] = 'woocommerce_order_status_made_to_relay';
$actions[] = 'woocommerce_order_status_made_to_processing';
$actions[] = 'woocommerce_order_status_made_to_completed';
$actions[] = 'woocommerce_order_status_out_to_scheduled';
$actions[] = 'woocommerce_order_status_out_to_made';
$actions[] = 'woocommerce_order_status_out_to_relay';
$actions[] = 'woocommerce_order_status_out_to_processing';
$actions[] = 'woocommerce_order_status_out_to_completed';
$actions[] = 'woocommerce_order_status_relay_to_scheduled';
$actions[] = 'woocommerce_order_status_relay_to_made';
$actions[] = 'woocommerce_order_status_relay_to_out';
$actions[] = 'woocommerce_order_status_relay_to_processing';
$actions[] = 'woocommerce_order_status_relay_to_completed';
$actions[] = 'woocommerce_order_status_processing_to_scheduled';
$actions[] = 'woocommerce_order_status_processing_to_made';
$actions[] = 'woocommerce_order_status_processing_to_out';
$actions[] = 'woocommerce_order_status_processing_to_relay';
$actions[] = 'woocommerce_order_status_processing_to_completed';
$actions[] = 'woocommerce_order_status_completed_to_scheduled';
$actions[] = 'woocommerce_order_status_completed_to_made';
$actions[] = 'woocommerce_order_status_completed_to_out';
$actions[] = 'woocommerce_order_status_completed_to_relay';
$actions[] = 'woocommerce_order_status_completed_to_processing';
        $bkfoptions = get_option("bkf_options_setting");
        if($bkfoptions["bkf_petals"] == "1") {
$actions[] = 'woocommerce_order_status_new';
$actions[] = 'woocommerce_order_status_accept';
$actions[] = 'woocommerce_order_status_reject';
$actions[] = 'woocommerce_order_status_scheduled_to_new';
$actions[] = 'woocommerce_order_status_scheduled_to_accept';
$actions[] = 'woocommerce_order_status_scheduled_to_reject';
$actions[] = 'woocommerce_order_status_made_to_new';
$actions[] = 'woocommerce_order_status_made_to_accept';
$actions[] = 'woocommerce_order_status_made_to_reject';
$actions[] = 'woocommerce_order_status_out_to_new';
$actions[] = 'woocommerce_order_status_out_to_accept';
$actions[] = 'woocommerce_order_status_out_to_reject';
$actions[] = 'woocommerce_order_status_relay_to_new';
$actions[] = 'woocommerce_order_status_relay_to_accept';
$actions[] = 'woocommerce_order_status_relay_to_reject';
$actions[] = 'woocommerce_order_status_processing_to_new';
$actions[] = 'woocommerce_order_status_processing_to_accept';
$actions[] = 'woocommerce_order_status_processing_to_reject';
$actions[] = 'woocommerce_order_status_completed_to_new';
$actions[] = 'woocommerce_order_status_completed_to_accept';
$actions[] = 'woocommerce_order_status_completed_to_reject';
$actions[] = 'woocommerce_order_status_new_to_scheduled';
$actions[] = 'woocommerce_order_status_new_to_made';
$actions[] = 'woocommerce_order_status_new_to_out';
$actions[] = 'woocommerce_order_status_new_to_relay';
$actions[] = 'woocommerce_order_status_new_to_processing';
$actions[] = 'woocommerce_order_status_new_to_completed';
$actions[] = 'woocommerce_order_status_new_to_accept';
$actions[] = 'woocommerce_order_status_new_to_reject';
$actions[] = 'woocommerce_order_status_accept_to_scheduled';
$actions[] = 'woocommerce_order_status_accept_to_made';
$actions[] = 'woocommerce_order_status_accept_to_out';
$actions[] = 'woocommerce_order_status_accept_to_relay';
$actions[] = 'woocommerce_order_status_accept_to_processing';
$actions[] = 'woocommerce_order_status_accept_to_completed';
$actions[] = 'woocommerce_order_status_accept_to_new';
$actions[] = 'woocommerce_order_status_accept_to_reject';
$actions[] = 'woocommerce_order_status_reject_to_scheduled';
$actions[] = 'woocommerce_order_status_reject_to_made';
$actions[] = 'woocommerce_order_status_reject_to_out';
$actions[] = 'woocommerce_order_status_reject_to_relay';
$actions[] = 'woocommerce_order_status_reject_to_processing';
$actions[] = 'woocommerce_order_status_reject_to_completed';
$actions[] = 'woocommerce_order_status_reject_to_new';
$actions[] = 'woocommerce_order_status_reject_to_accept';
        }
        return $actions;
    }
  
}

new Bkf_WC_Email();

Specific email's class:特定电子邮件的类别:

<?php
if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

if ( ! class_exists( 'WC_Email' ) ) {
    return;
}

/**
 * Class WC_Email_Customer_Out_for_Delivery_Order
 */
class WC_Email_Customer_Out_for_Delivery_Order extends WC_Email {

    /**
     * Create an instance of the class.
     *
     * @access public
     * @return void
     */
    function __construct() {

        $this->id          = 'customer_out_order';
        $this->title       = __( 'Order Out for Delivery', 'woocommerce' );
        $this->description = __( 'An email sent to the customer when an order is out for delivery.', 'woocommerce' );
        $this->customer_email = true;
        $this->heading     = __( 'Order Out for Delivery', 'woocommerce' );
        $this->subject     = sprintf( _x( '[%s] Order Out for Delivery', 'default email subject for out for delivery emails', 'woocommerce' ), '{blogname}' );

        $this->template_html  = 'emails/customer-out-order.php';
        $this->template_plain = 'emails/plain/customer-out-order.php';
        $this->template_base  = CUSTOM_WC_EMAIL_PATH . 'templates/';

        add_action( 'woocommerce_order_status_out', array( $this, 'trigger' ) );

        parent::__construct();
    }

    /**
     * Trigger Function that will send this email to the customer.
     *
     * @access public
     * @return void
     */
    function trigger( $order_id ) {
        $this->object = wc_get_order( $order_id );

        if ( version_compare( '3.0.0', WC()->version, '>' ) ) {
            $order_email = $this->object->billing_email;
        } else {
            $order_email = $this->object->get_billing_email();
        }

        $this->recipient = $order_email;


        if ( ! $this->is_enabled() || ! $this->get_recipient() ) {
            return;
        }

        $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
    }

    /**
     * Get content html.
     *
     * @access public
     * @return string
     */
    public function get_content_html() {
        return wc_get_template_html( $this->template_html, array(
            'order'         => $this->object,
            'email_heading' => $this->get_heading(),
            'additional_content' => $this->get_additional_content(),
            'sent_to_admin' => false,
            'plain_text'    => false,
            'email'         => $this
        ), '', $this->template_base );
    }

    /**
     * Get content plain.
     *
     * @return string
     */
    public function get_content_plain() {
        return wc_get_template_html( $this->template_plain, array(
            'order'         => $this->object,
            'email_heading' => $this->get_heading(),
            'additional_content' => $this->get_additional_content(),
            'sent_to_admin' => false,
            'plain_text'    => true,
            'email'         => $this
        ), '', $this->template_base );
    }

}

return new WC_Email_Customer_Out_for_Delivery_Order();

I welcome any ideas:)我欢迎任何想法:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 Woocommerce 中触发订单自定义状态更改的电子邮件 - Trigger email on order custom status change in Woocommerce 在 Woocommerce 中添加自定义订单状态并发送有关状态更改的电子邮件 - Add custom order status and send email on status change in Woocommerce WooCommerce - 发送自定义订单状态更改的自定义电子邮件 - WooCommerce - send custom email on custom order status change 在 WooCommerce 中自定义订单状态更改时发送“保留”email - Send "on hold" email on custom order status change in WooCommerce 当 woocommerce 订单状态通过操作挂钩完成时,如何触发邮件自动回复? - How to trigger mailster autoresponder when woocommerce order status is completed via action hook? 从订阅付款中触发woocommerce订单电子邮件挂钩 - Trigger woocommerce order email hook from subscription payment WooCommerce 触发器自定义 email 通过 AJAX - WooCommerce trigger custom email via AJAX PayPal WooCommerce - payment_complete 钩子来捕获使用的电子邮件 - PayPal WooCommerce - payment_complete hook to capture email used Woocommerce自定义订单状态更改日期 - Woocommerce custom order status change date WooCommerce订单状态处理然后将电子邮件与客户一起发送到自定义电子邮件 - WooCommerce order status processing then send an email to custom email along with customer
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM