【问题标题】:Customization of error messages at chekout page in woocommerce在 woocommerce 的结帐页面自定义错误消息
【发布时间】:2022-01-23 11:09:07
【问题描述】:

我正在尝试更改结帐页面中显示的错误消息。(为默认错误消息附加图片)

结帐页面的默认错误消息图片

例如。我想将错误消息 Billing First name is a required field 更改为 First name can't be left blank

为了实现这一点,我目前正在使用以下 -

首先,我从消息中删除了 Billing 关键字。为此,我使用了 我的function.php中的以下代码。

        function remove_billing_keyword_error( $error ) {
        if ( strpos( $error, 'Billing ' ) !== false ) {
            $error = str_replace("Billing ", "", $error);
        }
        return $error;
    }
add_filter( 'woocommerce_add_error', 'remove_billing_keyword_error' );

remove_billing_keyword_error 函数后的输出 -

之后,我使用 woocommerce_after_checkout_validation 操作挂钩来进行自定义验证和错误消息。但它是在默认验证后执行的,两条消息都显示(附图片)。

function woocommerce_checkout_extra_validation($fields, $validation_errors)
{
    if(is_user_logged_in())
    {
        error_log("User is logged in :: Callback Name woocommerce_checkout_extra_validation");
    }else{
        
           if ( isset( $_POST['billing_email'] ) && empty( $_POST['billing_email'] ) ) {
        $validation_errors->add( 'confirm_email_error', __( 'Confirm email address cannot be left blank.', 'woocommerce' ) );
    }

    }
    return $validation_errors;
}
add_action( 'woocommerce_after_checkout_validation', 'woocommerce_checkout_extra_validation', 10, 2);

输出 -

例如。对于电子邮件,电子邮件地址是必填字段确认电子邮件地址不能留空都显示。

有什么建议吗?

更新 1

根据@CBroe 建议的link,我修改了我的代码,现在我可以在结帐页面修改错误消息。以下是我修改后的代码-

function woocommerce_checkout_extra_validation($fields, $validation_errors)
{
    if(is_user_logged_in())
    {
        error_log("User is logged in :: Callback Name woocommerce_checkout_extra_validation");
    }else{
        
        // if any validation errors
    if( !empty( $validation_errors->get_error_codes() ) ) {
 
        // remove all of them
        foreach( $validation_errors->get_error_codes() as $code ) {
            $validation_errors->remove( $code );
        }
 
        // add our custom one
        //$validation_errors->add( 'validation', 'Please fill the fields!' );

        if ( isset( $_POST['billing_first_name'] ) && empty( $_POST['billing_first_name'] ) ) {
            $validation_errors->add( 'billing_first_name_error', __( 'First name cannot be left blank.', 'woocommerce' ) );
        }
        
        if ( isset( $_POST['billing_last_name'] ) && empty( $_POST['billing_last_name'] ) ) {
                $validation_errors->add( 'billing_last_name_error', __( 'Last name cannot be left blank.', 'woocommerce' ) );
        }
        
        if ( isset( $_POST['billing_email'] ) && empty( $_POST['billing_email'] ) ) {
            $validation_errors->add( 'confirm_email_error', __( 'Billing email address cannot be left blank.', 'woocommerce' ) );
        }
        if ( $fields['billing_email_cnfrm']  != $fields['billing_email']  ) {
            error_log("Confirm Email - " . $fields['billing_email_cnfrm'] ."And User Email - " . $fields['billing_email']);
            $validation_errors->add( 'email_not_match_error', __( 'Chekcout Error Email not match! .', 'woocommerce' ) );
        }
        if ( $fields['user_password_again']  != $fields['account_password']  ) {
            error_log("Checkout Password Log Block Run");
            $validation_errors->add( 'password_not_match_error', __( 'Chekcout Error Passwords do not match.', 'woocommerce' ) );
        }
        error_log("User is Not logged in :: Callback Name woocommerce_checkout_extra_validation");
        
    }    

    }
    return $validation_errors;
}
add_action( 'woocommerce_after_checkout_validation', 'woocommerce_checkout_extra_validation', 100, 2);

就我而言,我的问题是是否有任何内置机制可以在 woocommerce 中验证手机号码、电子邮件、号码等,或者我需要从头开始编写所有内容。

更新 2

为了自定义验证邮政编码,我使用的是 is_postcode() 函数。我在 function.php 文件中将它与 woocommerce_after_checkout_validation 操作挂钩一起使用。但我收到致命错误:

[29-Dec-2021 06:17:27 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function is_postcode() in D:\xampp\htdocs\wpreg\wp-content\themes\ljschildtheme\functions.php:703
Stack trace:
#0 D:\xampp\htdocs\wpreg\wp-includes\class-wp-hook.php(303): woocommerce_checkout_extra_validation(Array, Object(WP_Error))
#1 D:\xampp\htdocs\wpreg\wp-includes\class-wp-hook.php(327): WP_Hook->apply_filters(NULL, Array)
#2 D:\xampp\htdocs\wpreg\wp-includes\plugin.php(470): WP_Hook->do_action(Array)
#3 D:\xampp\htdocs\wpreg\wp-content\plugins\woocommerce\includes\class-wc-checkout.php(887): do_action('woocommerce_aft...', Array, Object(WP_Error))
#4 D:\xampp\htdocs\wpreg\wp-content\plugins\woocommerce\includes\class-wc-checkout.php(1161): WC_Checkout->validate_checkout(Array, Object(WP_Error))
#5 D:\xampp\htdocs\wpreg\wp-content\plugins\woocommerce\includes\class-wc-ajax.php(466): WC_Checkout->process_checkout()
#6 D:\xampp\htdocs\wpreg\wp-includes\class-wp-hook.php(303): WC_AJAX::checkout('')
#7 D:\xampp\htdocs\wpreg\wp-includes\class-wp-hook.php(327): WP_Hook->apply_filters('', Array)
#8 D:\xampp\htdocs\wpreg\wp-includes\plugin.php(470): WP_Hook->do_action(Array)
#9 D:\xampp\htdocs\wpreg\wp-content\plugins\woocommerce\includes\class-wc-ajax.php(90): do_action('wc_ajax_checkou...')
#10 D:\xampp\htdocs\wpreg\wp-includes\class-wp-hook.php(303): WC_AJAX::do_wc_ajax('')
#11 D:\xampp\htdocs\wpreg\wp-includes\class-wp-hook.php(327): WP_Hook->apply_filters(false, Array)
#12 D:\xampp\htdocs\wpreg\wp-includes\plugin.php(470): WP_Hook->do_action(Array)
#13 D:\xampp\htdocs\wpreg\wp-includes\template-loader.php(13): do_action('template_redire...')
#14 D:\xampp\htdocs\wpreg\wp-blog-header.php(19): require_once('D:\\xampp\\htdocs...')
#15 D:\xampp\htdocs\wpreg\index.php(17): require('D:\\xampp\\htdocs...')
#16 {main}
  thrown in D:\xampp\htdocs\wpreg\wp-content\themes\ljschildtheme\functions.php on line 703

我的邮政编码验证码 -

    if ( empty( $_POST['billing_postcode'] )) {
        $validation_errors->add( 'billing_postcode_error', __( 'Post code can not be left blank', 'woocommerce' ) );
    }

    if ( isset( $_POST['billing_postcode'] ) && is_postcode( $_POST['billing_postcode'],  $_POST['billing_city']) ) {
        $validation_errors->add( 'billing_postcode_country_error', __( 'Post code provided is invalid', 'woocommerce' ) );
    }

如何在 function.php 中为邮政编码、电话和电子邮件添加自定义验证 如果我想自定义结帐页面中的错误消息。我不想使用过滤器来更改错误文本。

任何建议。

【问题讨论】:

  • “例如,对于电子邮件这两个消息,电子邮件地址是必填字段,并且确认电子邮件地址不能留空。” - 不是这两条不同的消息开始吗和?第一个与电子邮件输入字段有关,第二个与电子邮件 confirmation 字段有关...?
  • 感谢 CBroe 的回复。我在 woocommerce_checkout_extra_validation 回调函数中添加了“确认电子邮件地址不能留空”,我正在检查帐单电子邮件是否为空和 isset,此时两条消息都显示。我是不是用错了钩子?
  • 您必须在 $validation_errors 中取消设置该字段已经存在的验证错误消息。 rudrastyh.com/woocommerce/custom-checkout-validation.html 有更多细节。
  • 在 unset aleady used 验证之后,您也可以使用 jquery valdations 并使其成为您想要的方式jqueryvalidation.org

标签: php wordpress woocommerce hook-woocommerce


【解决方案1】:

您可以使用 gettext 钩子修改由翻译函数 __() “包装”的任何文本。像这样:

add_filter( 'gettext', function( $translation, $text, $domain ){
if( $domain == 'woocommerce' ){
    if ( strpos($text, 'Billing First name is a required field') !== false ) {
        $translation =  str_replace('Billing First name is a required field', 'irst name can not be left blank.', $text);
    }
}   
return $translation;}, 10, 3 );

【讨论】:

  • 感谢 Movs 的回复。在结帐页面中,帐单和送货地址有 14 多个必填字段,我相信如果我们使用过滤器来更改文本,这会增加脚本的执行时间。
猜你喜欢
  • 2021-06-07
  • 1970-01-01
  • 2016-07-29
  • 2019-01-22
  • 2019-08-03
  • 1970-01-01
  • 2018-08-18
  • 2019-08-02
  • 2016-02-20
相关资源
最近更新 更多