在 Woocommerce 中提交结帐表单时格式化账单 phone 号码

Format billing phone number on Checkout form submission in Woocommerce

我正在尝试将提供的 phone 号码格式化为“920001234567”格式,就在客户点击提交按钮的那一刻。我希望 phone 号码以这种格式存储在数据库中。这是我要使用的代码。这有什么问题吗?

add_action( 'woocommerce_checkout_update_order_meta', 
  'formatPhoneOnComplete', 10, 2 );
  function formatPhoneOnComplete($order_id) {
  $order = wc_get_order($order_id);
  $order_data = $order->get_data();
  $phone = $order_data['billing']['phone'];
  $phone = trim($phone);
  $phone = str_replace([' ','-','_'],'',$phone);
    if(empty($phone)) {
        return NULL;
    }
    $phone = ltrim(ltrim($phone, '0'),'+');
    if(strlen($phone) <= 11) {
        $phone = '92' . ltrim($phone,0);
    }
    return $phone;
}

尝试以下操作,因为您的代码在返回格式化值时并没有真正在数据库中保存任何内容,这不是操作挂钩中的正确方法。

woocommerce_checkout_create_order 动作挂钩确实是 woocommerce_checkout_update_order_meta 挂钩的更好替代品……

我在以下挂钩函数中重用了您的格式化代码:

add_action( 'woocommerce_checkout_create_order', 'additional_hidden_checkout_field_save', 20, 2 );
function additional_hidden_checkout_field_save( $order, $data ) {
    if( ! isset($data['billing_phone']) ) return;

    if( ! empty($data['billing_phone']) ){
        $phone = str_replace([' ','-','_'],['','',''], $data['billing_phone']);
        $phone = ltrim(ltrim($phone, '0'),'+');
        $formatted_phone = strlen($phone) <= 11 ? '92' . ltrim($phone, 0) : $phone;
        // Set the formatted billing phone for the order
        $order->set_billing_phone( $formatted_phone );
    }
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。测试和工作。