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

时间:2020-08-23 09:51:59

标签: php wordpress woocommerce hook-woocommerce orders

我的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)作为订单号。现在,此代码仅使其成为临时代码。它不需要更新以前的订单号,只需更新新订单。

1 个答案:

答案 0 :(得分: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 ) {
    $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文件中。经过测试和工作。


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

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文件中。经过测试和工作。

enter image description here

相关问题