WooCommerce:将自定义数据添加到处理订单

时间:2020-11-10 19:44:42

标签: wordpress woocommerce hook-woocommerce woocommerce-bookings

我需要在处理订单电子邮件中添加自定义数据,但是数据总是在发送电子邮件后更新,如下所示:

订单状态更改==>发送电子邮件==>在自定义表格(插件)上插入数据

我需要的是:

订单状态更改==>在自定义表(插件)上插入数据==>发送电子邮件。

我已经检查了,这是通过以下钩子函数完成的:

add_action('woocommerce_order_status_changed', 'fun_order_status_changed', 10, 4);
function fun_order_status_changed($order_id, $from_status, $to_status, $order){

    // Some code

    // Then insert to database
}

我该怎么办或需要修改哪些文件,以便首先将插入内容保存在数据库中,然后发送电子邮件?

编辑1

我故意放了一个var_dump,然后首先执行邮件模板文件enter image description here

2 个答案:

答案 0 :(得分:0)

您可以尝试将woocommerce_order_status_pending_to_processing_notification动作挂钩与lower priority一起使用,例如5。这样,它将在发送邮件之前得到处理。

答案 1 :(得分:0)

如果要在订单元数据中添加自定义字段,将该字段的值与订单确认邮件一起发送,并在后端的订单详细信息和编辑屏幕中另外显示,则可以使用以下代码。有多个步骤需要完成。

  1. 创建一个新字段以显示在WooCommerce Checkout中。如果要确保输入值,请根据需要进行设置。为此,我们使用'woocommerce_after_checkout_billing_form'。 (只是一个旁注:如果您有其他目的,也可以使用隐藏字段和给定值)
  2. 使用'woocommerce_checkout_update_order_meta'在订单元数据中保存值
  3. 使用'woocommerce_email_order_meta_keys'完成订单后,将值添加到要发送的电子邮件中
  4. 使用'woocommerce_order_details_after_order_table'在后​​端的订单详细信息屏幕中显示值,对于订单编辑屏幕'woocommerce_admin_order_data_after_billing_address',将值显示在帐单地址下方。注意:该值不会显示(但仍会保存在数据库中),如果订单是在后端进行的,则仅适用于放置在前端的订单(现在将超出范围)。

在我的代码示例中,我执行了以下步骤来添加VAT ID字段,该字段在欧洲对于企业对企业交易非常重要。增值税ID也已添加到电子邮件和后端屏幕。

您可以根据需要调整名称(vat_number或“ mrank”前缀),但请记住保持一致。

/**
* VAT Number in WooCommerce Checkout
*/
function mrank_vat_field( $checkout ) {

      echo '<div id="mrank_vat_field">';
   
      woocommerce_form_field( 'vat_number', array(
            'type'          => 'text',
            'class'         => array( 'vat-number-field form-row-wide') ,
            'label'         => __( 'VAT-ID' ),
            'placeholder'   => __( 'Enter number' ),
            'description' => __( 'Please enter your VAT-ID' ),
            'required'    => true,
      ), $checkout->get_value( 'vat_number' ));
    
    echo '</div>';
}
add_action( 'woocommerce_after_checkout_billing_form', 'mrank_vat_field' );


/**
* Save VAT Number in the order meta
*/
function mrank_checkout_vat_number_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['vat_number'] ) ) {
        update_post_meta( $order_id, '_vat_number', sanitize_text_field( $_POST['vat_number'] ) );
    }
}
add_action( 'woocommerce_checkout_update_order_meta', 'mrank_checkout_vat_number_update_order_meta' );


/**
 * Display VAT Number in order details screen
 */
function mrank_vat_number_display_order_details($order){
    echo '<p><strong>'.__('VAT-ID').':</strong> ' . get_post_meta( $order->get_id(), '_vat_number', true ) . '</p>';
}
add_action( 'woocommerce_order_details_after_order_table', 'mrank_vat_number_display_order_details', 10, 1 );


/**
 * Display VAT Number in order edit screen
 */
function mrank_vat_number_display_admin_order_meta( $order ) {
    echo '<p><strong>' . __( 'VAT-ID', 'woocommerce' ) . ':</strong> ' . get_post_meta( $order->get_id(), '_vat_number', true ) . '</p>';
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'mrank_vat_number_display_admin_order_meta', 10, 1 );


/**
* VAT Number in emails
*/
function mrank_vat_number_display_email( $keys ) {
     $keys['VAT-ID'] = '_vat_number';
     return $keys;
}
add_filter( 'woocommerce_email_order_meta_keys', 'mrank_vat_number_display_email' );