基于付款方式的动态自定义订单号 [英] Dynamic custom order numbers based on payment method

查看:52
本文介绍了基于付款方式的动态自定义订单号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的functions.php文件中包含以下代码:

I have the following code in my functions.php file:

add_filter( 'woocommerce_order_number', 'change_woocommerce_order_number' );

function change_woocommerce_order_number( $order_id ) {
    $order = wc_get_order( $order_id );
    //$order->get_total();

    $method_of_payment = $order->get_payment_method();

    if (  $method_of_payment == 'cheque' ) {
        $prefix       = 'CHE';
        $suffix       = '';
        $new_order_id = $prefix . $order_id . $suffix;
        return $new_order_id;
    } else {
        return $order_id;
    }
}

该代码有效,但我希望它永久保存新的订单号.如果用户使用支票付款结帐,它将在数据库中永久地将CHEXXXX(例如CHE5783)作为订单号.现在,此代码仅使其成为临时代码.它不需要更新以前的订单号,只需更新新订单.

The code works but I want it to permanently save the new order number. It should permanently make CHEXXXX (ex. CHE5783) the order number in the database if the user checked out using check payments. Right now this code only makes it temporary. It does not need to update previous order numbers, only new orders.

推荐答案

由于方法 WC_Order set_order_number()不存在,我们将添加一个自定义字段(自定义元数据)(下订单时).然后,我们将在 woocommerce_order_number 过滤器挂钩中获取该订单的自定义元数据.

As the method WC_Order set_order_number() doesn't exist, we will add a custom field (custom meta data) when an order is placed (on order creation). Then we will get that order custom meta data in woocommerce_order_number filter hook.

代码:

add_action( 'woocommerce_checkout_update_order_meta', 'save_the_order_number', 10, 2 );
function save_the_order_number( $order_id, $data ) {
    $order = wc_get_order( $order_id ); // The order Object

    if ( 'cheque' === $order->get_payment_method() ) {
        $prefix = 'CHE';
        $suffix = '';
    } else {
        $prefix = '';
        $suffix = '';
    }
    update_post_meta( $order_id, '_order_number', $prefix . $order_id . $suffix );
}

add_filter( 'woocommerce_order_number', 'set_order_number', 10, 2 );
function set_order_number( $order_id, $order ) {
    // Get the order number (custom meta data)
    $order_number = $order->get_meta('_order_number'); 
    
    // If the order number doesn't exist (we keep that for old orders, or manual orders)
    if ( empty($order_number) ) {
        if ( 'cheque' === $order->get_payment_method() ) {
            $prefix       = 'CHE';
            $suffix       = '';
            $order_number = $prefix . $order_id . $suffix;
        } else {
            $order_number = $order_id;
        }
    }
    return $order_number;
}

代码进入您的活动子主题(或活动主题)的functions.php文件中.经过测试和工作.

Code goes in functions.php file of your active child theme (or active theme). Tested and work.

现在,如果您希望能够在管理员订单页面上编辑订单号,请另外使用以下代码:

Now if you want to be able to edit the order number on admin order pages, use additionally the following code:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_admin_order_order_number_custom_field' );
function display_admin_order_order_number_custom_field( $order ){
    echo '<div class="edit_order_number"><p class="form-field _order_number_field" style="width:100%;">
    <label for="_order_number">'. __("Order number", "woocommerce").':</label>
    <input type="text" id="_order_number" name="_order_number" value="'. $order->get_order_number() .'">
    </p></div>';
}

add_action( 'save_post_shop_order', 'save_admin_order_order_number_custom_field' );
function save_admin_order_order_number_custom_field( $post_id ) {
    // If this is an autosave, our form has not been submitted, so we don't want to do anything.
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    // Check the user's permissions.
    if ( ! current_user_can( 'edit_shop_order', $post_id ) ) {
        return;
    }

    // Make sure that 'shipping_date' is set.
    if ( isset( $_POST['_order_number'] ) ) {
        // Update custom field value
        update_post_meta( $post_id, '_order_number', sanitize_text_field( $_POST['_order_number'] ) );
    }
}

代码进入您的活动子主题(或活动主题)的functions.php文件中.经过测试和工作.

Code goes in functions.php file of your active child theme (or active theme). Tested and work.

这篇关于基于付款方式的动态自定义订单号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆