【问题标题】:WooCommerce: Adding custom data to processing orderWooCommerce:将自定义数据添加到处理订单
【发布时间】:2021-02-22 19:04:21
【问题描述】:

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

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

我需要的是:

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

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

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,先执行邮件template

【问题讨论】:

  • 请问:如何保存到数据库? code# 是你使用 wp_mail 的地方吗?或者您想更改 woocommerce 发送的默认邮件?
  • 我不想把邮件的发送改成个性化的,我想改一下插入自定义表数据的钩子,这样就可以在更改之间发送状态和电子邮件的发送
  • 有人帮不了我吗?
  • 希望我的回答能帮到你

标签: wordpress woocommerce hook-woocommerce woocommerce-bookings


【解决方案1】:

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

【讨论】:

  • 你告诉我是把钩子“woocommerce_order_status_changed”改成钩子“woocommerce_order_status_pending_to_processing_notification”
  • 是的,这个钩子就是发送电子邮件的地方。因此,通过使用低于默认值 (10) 的优先级,您的代码应该在发送电子邮件之前运行。
  • 没有用 :( 我把钩子和测试用了很多优先级数
【解决方案2】:

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

  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',这会将其放置在帐单地址下方。注意:该值不会显示(但仍会保存在数据库中),如果订单是在后端下的,则仅适用于在前端下的订单(现在将超出范围)。

在我的代码示例中,我执行此步骤是为了添加一个增值税 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' );

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 2016-10-12
    • 2021-05-07
    • 2018-07-12
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多