php - 避免对某些自动完成的订单重复发送电子邮件通知

标签 php wordpress woocommerce hook-woocommerce orders

我正在 WooCommerce 上使用这段代码 from this answer基于支付网关自动完成付费处理订单:

/**
 * 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_thankyou”之后处理付款。在这种情况下,暂停状态订单随后会转为处理中状态。为了在这些情况下自动执行自动完成行为,我使用了 this answer 中的其他和平代码。它有效:

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 update_post_meta() 为每个已处理的订单创建自定义元键/值。功能。然后我们将在之前的条件下测试此自定义元数据键/值是否存在 get_post_meta()每个已处理订单的函数。

所以你的两个代码片段现在将是:

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+ 以来的兼容性):

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;
}

2) 扫描所有“正在处理”的订单 自动完成它们(添加了 Woocommerce 兼容性)

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
            }
        }
    }
}

代码位于事件子主题(或主题)的 function.php 文件中。或者也可以在任何插件 php 文件中。

我已经测试了此代码,它应该适合您(由于您特定的短信桥接付款方式)

关于php - 避免对某些自动完成的订单重复发送电子邮件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41074461/

相关文章:

WordPress:更改永久链接结构后如何重定向旧链接?

wordpress - Woocommerce 无法禁用访客结账

javascript - 使用javascript重新加载php页面

php - 如果大于 0,则计算行数和返回结果

php - 使用 WordPress Super Cache 从缓存中排除动态值

css - Woocommerce 图片 - 添加图片宽度

wordpress - woocommerce 显示类别/子类别/产品

PHP/MySQL 独立安装程序/更新程序脚本?

php - 如何防止使用 foreach 插入多行的 SQL 注入(inject)?

mysql - 将一列拆分为多列 [Wordpress]