電話番号を検証するための独自の正規表現を追加したいと思います。私のclass-wc-validation.php
必要に応じて正規表現を変更しました。
public static function is_phone( $phone ) {
//if ( strlen( trim( preg_replace( '/[\s\#0-9_\-\+\(\)]/', '', $phone ) ) ) > 0 )
if ( strlen( trim( preg_replace( '/^[6789]\d{9}$/', '', $phone ) ) ) > 0 )
return false;
return true;
}
しかし、検証は行われていません。何が欠けていますか?
これらをwoocommerceチェックアウトフローにフックするコードは見たことがありません。上のドキュメントを確認してください
woocommerce_checkout_process
およびwoocommerce_checkout_order_processed
しかし、あなたの場合は、woocommerce_checkout_process
に接続することを強くお勧めします
以下のコードをテーマのfunctions.phpに配置するか、独自のwoocommerceプラグインを作成して、bootstrapコードに配置します。
add_action('woocommerce_checkout_process', 'is_phone');
function is_phone() {
$phone_number = $_POST['---your-phone-field-name---'];
// your function's body above, and if error, call this wc_add_notice
wc_add_notice( __( 'Your phone number is wrong.' ), 'error' );
}
同じ問題に直面していて、他の人がここで言ったことに従っていたが、Woocommerceはwoocommerce_checkout_process
針。
しかし、最新のWoocommerce 3.0(これが2.xバージョンであるかどうかは不明)では、woocommerce_after_checkout_validation
フックしてから$data
param標準のチェックアウトフィールドを使用している場合、または$_POST
標準のWoocommerceの方法で追加されていないカスタムフィールドがある場合。コードの例は次のとおりです。
public function validate($data,$errors) {
// Do your data processing here and in case of an
// error add it to the errors array like:
$errors->add( 'validation', __( 'Please input that correctly.' ));
}
add_action('woocommerce_after_checkout_validation', 'validate',10,2);
お役に立てば幸いです。
プラグインファイルを編集しないでください。プラグインを更新すると、すべてのカスタマイズが失われ、フックを使用して目的を達成できるからです。
woocommerce_checkout_process
フックを使用してこれを行うことができます。
これがコードです:
add_action('woocommerce_checkout_process', 'wh_phoneValidateCheckoutFields');
function wh_phoneValidateCheckoutFields() {
$billing_phone = filter_input(INPUT_POST, 'billing_phone');
if (strlen(trim(preg_replace('/^[6789]\d{9}$/', '', $billing_phone))) > 0) {
wc_add_notice(__('Invalid <strong>Phone Number</strong>, please check your input.'), 'error');
}
}
コードは、アクティブな子テーマ(またはテーマ)のfunctions.php
ファイルに入ります。または、プラグインでもPHP files。
注:デフォルトでは、WooCommerceはbilling_phone
フィールドを使用して電話番号を取得しますが、それをカスタマイズしている場合は、billing_phone
をフィールド名に置き換えることができます。
お役に立てれば!
あなたの質問では、検証ルールが機能していないと言っていますが、間違った方法で書かれていると思います。正規表現ツールを使用してオンラインでテストできます。 Regex101 またはその他。
このトピックに関するより一般的な答えとして、検証ルールを安全に変更するには、次のようにします。
class-wc-validation.php
をyour_theme_path/woocommerce/includes/class-wc-validation.php
のテーマディレクトリにコピーし、検証ルールをカスタマイズします。
次に、checkout.js
に登録されている電話の検証ルールを作成する必要があります。そうしないと、フィールドが無効であっても、フィールドに常に緑色の境界線が表示されます。
したがって、私の解決策は、192行目についてのカスタム正規表現バリデーターをcheckout.js
に追加することでした。
if ( $parent.is( '.validate-phone' ) ) {
if ( $this.val() ) {
var pattern = new RegExp(/^([0-9\s\/\+\-\#\_\(\)]*)$/);
if ( ! pattern.test( $this.val() ) ) {
$parent.removeClass( 'woocommerce-validated' ).addClass( 'woocommerce-invalid woocommerce-invalid-phone' );
validated = false;
}
}
}
カスタマイズした.jsファイルを含めます(functions.php
に)
add_action( 'wp_enqueue_scripts', 'my_checkoutjs_enqueue_scripts', 100 );
function gv_checkoutjs_enqueue_scripts() {
if ( is_checkout() ) {
wp_deregister_script( 'wc-checkout' );
wp_enqueue_script( 'wc-checkout', get_template_directory_uri() . '/js/modified_checkout.js', array( 'jquery', 'woocommerce', 'wc-country-select', 'wc-address-i18n' ) );
}}
お役に立てれば!