【发布时间】: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