基于付款方式的动态自定义订单号

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


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)永久设为数据库中的订单号。现在这段代码只是暂时的。它不需要更新以前的订单号,只需要更新新订单。


慕姐4208626
浏览 68回答 1
1回答

子衿沉夜

由于该方法WC_Order set_order_number()不存在,我们将在下订单时(在订单创建时)添加自定义字段(自定义元数据)。然后我们将在过滤器挂钩中获取该订单自定义元数据woocommerce_order_number。代码:add_action( 'woocommerce_checkout_update_order_meta', 'save_the_order_number', 10, 2 );function save_the_order_number( $order_id, $data ) {&nbsp; &nbsp; $order = wc_get_order( $order_id ); // The order Object&nbsp; &nbsp; if ( 'cheque' === $order->get_payment_method() ) {&nbsp; &nbsp; &nbsp; &nbsp; $prefix = 'CHE';&nbsp; &nbsp; &nbsp; &nbsp; $suffix = '';&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; $prefix = '';&nbsp; &nbsp; &nbsp; &nbsp; $suffix = '';&nbsp; &nbsp; }&nbsp; &nbsp; 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 ) {&nbsp; &nbsp; // Get the order number (custom meta data)&nbsp; &nbsp; $order_number = $order->get_meta('_order_number');&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; // If the order number doesn't exist (we keep that for old orders, or manual orders)&nbsp; &nbsp; if ( empty($order_number) ) {&nbsp; &nbsp; &nbsp; &nbsp; if ( 'cheque' === $order->get_payment_method() ) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $prefix&nbsp; &nbsp; &nbsp; &nbsp;= 'CHE';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $suffix&nbsp; &nbsp; &nbsp; &nbsp;= '';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $order_number = $prefix . $order_id . $suffix;&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $order_number = $order_id;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return $order_number;}代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并工作。现在,如果您希望能够在管理订单页面上编辑订单号,请另外使用以下代码: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 ){&nbsp; &nbsp; echo '<div class="edit_order_number"><p class="form-field _order_number_field" style="width:100%;">&nbsp; &nbsp; <label for="_order_number">'. __("Order number", "woocommerce").':</label>&nbsp; &nbsp; <input type="text" id="_order_number" name="_order_number" value="'. $order->get_order_number() .'">&nbsp; &nbsp; </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 ) {&nbsp; &nbsp; // If this is an autosave, our form has not been submitted, so we don't want to do anything.&nbsp; &nbsp; if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {&nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; }&nbsp; &nbsp; // Check the user's permissions.&nbsp; &nbsp; if ( ! current_user_can( 'edit_shop_order', $post_id ) ) {&nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; }&nbsp; &nbsp; // Make sure that 'shipping_date' is set.&nbsp; &nbsp; if ( isset( $_POST['_order_number'] ) ) {&nbsp; &nbsp; &nbsp; &nbsp; // Update custom field value&nbsp; &nbsp; &nbsp; &nbsp; update_post_meta( $post_id, '_order_number', sanitize_text_field( $_POST['_order_number'] ) );&nbsp; &nbsp; }}代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并工作。
打开App,查看更多内容
随时随地看视频慕课网APP