问题描述
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)作为订单号。现在,此代码仅使其成为临时代码。它不需要更新以前的订单号,只需更新新订单。
解决方法
由于方法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',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,sanitize_text_field( $_POST['_order_number'] ) );
}
}
代码进入活动子主题(或活动主题)的functions.php文件中。经过测试和工作。