Php 避免重复发送电子邮件通知某些自动完成的订单
我正在使用WooCommerce上的这段代码自动完成基于支付网关的支付处理订单:Php 避免重复发送电子邮件通知某些自动完成的订单,php,wordpress,woocommerce,hook-woocommerce,orders,Php,Wordpress,Woocommerce,Hook Woocommerce,Orders,我正在使用WooCommerce上的这段代码自动完成基于支付网关的支付处理订单: /** * AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE */ add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 ); function custom_woocommerce_auto_complete_paid_order( $order_id )
/**
* AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
*/
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
function custom_woocommerce_auto_complete_paid_order( $order_id ) {
if ( ! $order_id ) {
return;
}
$order = wc_get_order( $order_id );
// No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cod' ) || ( get_post_meta($order->id, '_payment_method', true) == 'cheque' ) ) {
return;
}
// "completed" updated status for paid Orders with all others payment methods
else {
$order->update_status( 'completed' );
}
}
这基本上是完美的
主要通过短信使用一个特殊的支付网关,该网关的API连接在“cod”支付方式上,可以在“woocommerce\u thankyou,out side frontend”之后处理支付。在这种情况下,保留状态指令随后传递到处理状态。为了在这些情况下实现自动完成行为的自动化,我使用了来自的另一种代码,它可以工作:
function auto_update_orders_status_from_processing_to_completed(){
// Get all current "processing" customer orders
$processing_orders = wc_get_orders( $args = array(
'numberposts' => -1,
'post_status' => 'wc-processing',
) );
if(!empty($processing_orders))
foreach($processing_orders as $order)
$order->update_status( 'completed' );
}
add_action( 'init', 'auto_update_orders_status_from_processing_to_completed' );
问题:我收到了关于新完成订单的重复电子邮件通知
我如何避免这种重复的电子邮件通知案例
谢谢更新(2019年)
添加了Woocommerce 3+的版本代码-添加了Woocommerce版本兼容性
为了避免重复发送电子邮件通知这一奇怪的事实,可以在将订单状态更改为“已完成”时,使用WordPress功能为每个已处理的订单创建自定义元键/值。然后,我们将在一个条件下测试之前,如果这个自定义元数据键/值与每个处理订单的函数一起存在
现在,您的两个代码片段将是:
1) 在WOOCOMMERCE中自动完成支付订单(2019年更新)
对于woocommerce 3+:
add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
if ( ! $order->has_status('completed') && $order->get_meta('_order_processed') != 'yes') {
$order->update_meta_data('_order_processed', 'yes');
$status = 'completed';
}
return $status;
}
对于所有woocommerce版本(自版本2.5+起的兼容性):
2) 扫描所有“处理”订单以自动完成它们(增加了商业兼容性)
add_action('init','auto_update_orders_status_from_processing_to_completed');
功能自动更新订单状态从处理状态到完成状态(){
如果(版本比较)(WC_版本,'3.0',再次感谢Loïc它工作得非常好,祝你有一个美好的一天,男士(y)
add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order = null ) {
// Getting the custom meta value regarding this autocomplete status process
$order_processed = get_post_meta( $order_id, '_order_processed', true );
// Getting the WC_Order object from the order ID
$order = wc_get_order( $order_id );
if ( ! $order->has_status( 'completed' ) && $order_processed != 'yes' ) {
$order = wc_get_order( $order_id );
// setting the custom meta data value to yes (order updated)
update_post_meta($order_id, '_order_processed', 'yes');
$order->update_status( 'completed' ); // Update order status to
}
return $status;
}
add_action( 'init', 'auto_update_orders_status_from_processing_to_completed' );
function auto_update_orders_status_from_processing_to_completed(){
if( version_compare( WC_VERSION, '3.0', '<' ) {
$args = array('numberposts' => -1, 'post_status' => 'wc-processing'); // Before WooCommerce version 3
} else {
$args = array('limit' => -1, 'status' => 'processing'); // For WooCommerce 3 and above
}
// Get all current "processing" customer orders
$processing_orders = (array) wc_get_orders( $args );
if( sizeof($processing_orders) > 0 ){
foreach($processing_orders as $order ) {
// Woocommerce compatibility
$order_id = method_exists( $order, 'get_id' ) ? $order->get_id() : $order->id;
// Checking if this custom field value is set in the order meta data
$order_processed = get_post_meta( $order_id, '_order_processed', true );
if (! $order->has_status( 'completed' ) && $order_processed != 'yes' ) {
// Setting (updating) custom meta value in the order metadata to avoid repetitions
update_post_meta( $order_id, '_order_processed', 'yes' );
$order->update_status( 'completed' ); // Updating order status
}
}
}
}