Woocommerce通过php设置order_status并触发电子邮件[关闭]

问题描述 投票:1回答:2

我用Java编写了一个程序,完全填写了Woocommerce的订单。完成订单后,程序通过sql将订单状态更改为已完成。问题是客户的订单完成电子邮件不会以这种方式发送。

如何使用php从我的数据库中列出的订单更改order_status

一旦order_status将通过php更改,我认为客户订单已完成电子邮件通知将被发送。

使用我的java程序,我可以写入/读取数据库并打开网站。

java php sql wordpress woocommerce
2个回答
1
投票

您的Java应用程序可以使用meta_key(例如)具有任何值的'_need_status_update'(例如'1')创建订单的自定义字段,而不是完成订单。

现在,下面的钩子函数将检查(每当有人浏览网站时)此特定自定义字段('meta_key' = '_need_status_update')。

如果找到自定义字段,它将:

  • 删除此自定义字段(元数据)
  • 将订单状态更新为“已完成”
  • 触发电子邮件通知给客户

钩住功能:

add_action( 'init', 'check_orders_update_status' );
function check_orders_update_status(){
    global $wpdb;

    $meta_key = '_need_status_update';

    // SQL query Get orders Ids that have a meta key like '_need_status_update'
    $orders_ids = $wpdb->get_col( "
        SELECT pm.post_id
        FROM {$wpdb->prefix}postmeta as pm
        WHERE pm.meta_key LIKE '$meta_key'
    " );

    if( count($orders_ids) > 0 ){
        foreach( $orders_ids as $order_id) {
            // Get an instance of the WC_Order object
            $order = wc_get_order($order_id);

            // Delete the meta data '_need_status_update'
            delete_post_meta( $order_id, $meta_key );

            // Updating Order status (will send "Customer order completed" email notification
            $order->update_status('completed');
        }
    }
}

此代码位于活动子主题(或活动主题)的function.php文件中。

代码经过测试和运行。

更改Java App中的需求: 您只需要更改应用的行为,即为wp_postmeta添加给定的现有订单ID,自定义字段如:

  • meta_key'_need_status_update'一样(两边都可以在方便的时候重新命名)
  • meta_value'1'一样

一旦完成,一切都将自动化。

最后,检查订单的函数中的SQL请求非常轻...


0
投票

我们如何做到这一点是通过创建一个插件来取代原来的WooCommerce订单状态和电子邮件行为。

这是如何做:

  1. 如果您需要添加/删除默认订单状态,您可以通过挂钩到wc_order_statuses挂钩,并通过业务流程返回一系列有效订单状态,并在register_post_status()挂钩中执行init
  2. 电子邮件发送状态更改操作由电子邮件类定义。它们可以通过挂钩到woocommerce_email_classes钩子来改变。以下是我们所做的一小部分: /* * @hook woocommerce_email_classes * @param WC_Email[] $emails * @return WC_Email[] */ public static function initCustomEmails($emails) { // Replace all emails with our own global $wp_filter; unset($wp_filter['woocommerce_order_status_completed_notification']); $emails = [ 'WC_Email_Customer_New_Account' => include('emails/classes/WC_Email_Customer_New_Account.php'), 'WC_Email_Customer_Order_Verify' => include('emails/classes/WC_Email_Customer_Order_Verify.php'), ... ]; return $emails; }

以下是引用的电子邮件类的片段:

if ( ! class_exists('WC_Email_Customer_Order_Verify') ) {

    class WC_Email_Customer_Order_Verify extends WC_Email {

        /**
         * Constructor
         */
        function __construct() {
            // Triggers for this email
            add_action( 'woocommerce_order_status_order-verify', array( $this, 'trigger' ) );
            add_action( 'woocommerce_checkout_order_processed', array( $this, 'trigger' ) );

            // Call parent constructor
            parent::__construct();
        }

        /**
         * Trigger.
         * @param WC_Order|int $wcOrder
         * @throws InvalidOrderException
         */
        function trigger( $wcOrder ) {
            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 function.
         *
         * @access public
         * @return string
         */
        function get_content_html() {
            ob_start();
            wc_get_template( $this->template_html, array(
                'order'         => $this->object,
                'orderDetails'  => $this->orderDetails,
                'sent_to_admin' => false,
                'plain_text'    => false
            ) );
            return ob_get_clean();
        }

        /**
         * get_content_plain function.
         *
         * @access public
         * @return string
         */
        function get_content_plain() {
            ob_start();
            wc_get_template( $this->template_plain, array(
                'order'         => $this->object,
                'orderDetails'  => $this->orderDetails,
                'sent_to_admin' => false,
                'plain_text'    => true
            ) );
            return ob_get_clean();
        }
    }

}

return new WC_Email_Customer_Order_Verify();

触发器以及触发时的操作定义如上。希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.