问题描述
我需要在处理订单电子邮件中添加自定义数据,但是数据总是在发送电子邮件后更新,如下所示:
订单状态更改==>发送电子邮件==>在自定义表格(插件)上插入数据
我需要的是:
订单状态更改==>在自定义表(插件)上插入数据==>发送电子邮件。
我已经检查了,这是通过以下钩子函数完成的:
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
解决方法
您可以尝试将woocommerce_order_status_pending_to_processing_notification
动作挂钩与lower priority
一起使用,例如5。这样,它将在发送邮件之前得到处理。
如果要在订单元数据中添加自定义字段,将该字段的值与订单确认邮件一起发送,并在后端的订单详细信息和编辑屏幕中另外显示,则可以使用以下代码。有多个步骤需要完成。
- 创建一个新字段以显示在WooCommerce Checkout中。如果要确保输入值,请根据需要进行设置。为此,我们使用
'woocommerce_after_checkout_billing_form'
。 (只是一个旁注:如果您有其他目的,也可以使用隐藏字段和给定值) - 使用
'woocommerce_checkout_update_order_meta'
在订单元数据中保存值 - 使用
'woocommerce_email_order_meta_keys'
完成订单后,将值添加到要发送的电子邮件中 - 使用
'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(),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(),true ) . '</p>';
}
add_action( 'woocommerce_admin_order_data_after_billing_address','mrank_vat_number_display_admin_order_meta',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' );