Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Woocommerce通过php设置订单状态并触发电子邮件_Java_Php_Sql_Wordpress_Woocommerce - Fatal编程技术网

Java Woocommerce通过php设置订单状态并触发电子邮件

Java Woocommerce通过php设置订单状态并触发电子邮件,java,php,sql,wordpress,woocommerce,Java,Php,Sql,Wordpress,Woocommerce,我用Java编写了一个程序,它可以满足来自Woocommerce的订单。完成订单填写后,程序通过sql将订单状态更改为“已完成”。问题是,客户的订单完成电子邮件将不会以这种方式发送 如何使用php更改数据库中列出的订单的order\u状态 我认为一旦订单状态通过php更改,将发送客户订单完成电子邮件通知 通过我的java程序,我可以写/读我的数据库和打开网站。我们如何做到这一点,是通过创建一个插件来取代原来的WooCommerce订单状态和电子邮件行为 以下是方法: 如果需要添加/删除默认订单状

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

如何使用php更改数据库中列出的订单的
order\u状态

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


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

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

以下是方法:

  • 如果需要添加/删除默认订单状态,可以通过挂接到
    wc\u order\u status
    hook来执行,并通过业务流程返回有效订单状态数组,然后在
    init
    hook中执行
    register\u post\u status()

  • 状态更改操作时的电子邮件发送由电子邮件类定义。它们可以通过挂接到
    woocommerce\u email\u类
    hook来更改。下面是我们所做工作的一个片段:

    /*
     * @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();
    
    上面定义了触发器以及触发时要执行的操作。
    希望这能有所帮助。

    您的Java应用程序不必完成订单,而是可以使用
    meta\u键为订单创建一个自定义字段,如(例如)带有任何值的
    “\u need\u status\u update”
    (例如
    '1'

    现在,下面的钩子函数将检查(每次有人浏览网站时)此特定自定义字段(
    'meta\u key'='\u need\u status\u 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应用程序中的需求:
    您只需更改应用程序的行为,这将为给定的现有订单ID在wp_Posteta中添加一个自定义字段,如:

    • meta\u键
      类似于
      “您需要状态更新”
      (可以在您方便的时候在两侧重命名)
    • meta\u值
      Like
      '1'
    一旦完成,一切都将自动化


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

    您好,谢谢您的回答!我曾经这样尝试过,但是当我打开我的页面时,我收到了以下错误:致命错误:未捕获错误:调用boolean上的成员函数update_status()。你知道错误是什么吗?@Philippriter我已经测试了在现有订单中添加自定义字段(在数据库表wp_Posteta中手动)之前的代码。然后,当我浏览任何页面时,自定义元数据被删除,订单状态变为已完成并触发电子邮件,没有任何错误。订单必须是真正的WC_订单…如果不是,方法更新_状态将失败并引发类似错误。@PhilippRitter我刚刚重新测试了我的代码,它可以正常工作…因此订单本身肯定有问题…如果您是从应用程序生成的,则缺少一些内容。我在上一个WooCommerce版本和上一个Wordpress版本下进行测试。我在java程序中犯了一个错误。我把订单id放在meta\u值中,而不是post\u id中-对不起!现在我再次测试了代码,它工作得非常好!非常感谢您的回答!菲利普