Woocommerce通过php设置order_status并触发电子邮件

时间:2017-12-26 07:46:04

标签: java php sql wordpress woocommerce

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

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

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

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

2 个答案:

答案 0 :(得分: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请求非常轻......

答案 1 :(得分:0)

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

以下是:

  1. 如果您需要添加/删除默认订单状态,可以通过挂钩wc_order_statuses挂钩,并通过业务流程返回一系列有效订单状态来执行此操作,然后执行{{1}在register_post_status()挂钩。

  2. 电子邮件发送状态更改操作由电子邮件类定义。它们可以通过钩住init钩子来改变。以下是我们所做的一小部分:

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

    /*
     * @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;
    }
    

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