提交后重新设置注册表单字段(wordpress&;wooccommerce)


Registration form fields reset after submit (wordpress & woocommerce)

我有一份wooccommerce登记表,有两个部分:
-一个用于私人,
-另一个是公司

在公司选项中有两个附加字段。我可以通过单选按钮在私人和公司之间切换,然后我可以看到相关的字段。

问题:当我填写表单(作为私人用户)并犯了一些错误时,表单会重新加载并显示错误所在(这是可以的)。

但不幸的是,在重新加载后,它会加载包含所有字段的表单(也包含其他公司字段的字段)。所以我需要在私人和公司之间点击2次才能恢复正确的行为。

我该怎么解决这个问题?我的意思是,在这个错误重新加载之后,将表单显示为初始状态。

我不确定这是不是代码造成的,但让我们试试:

add_filter('woocommerce_registration_errors', 'rs_registration_form_validation', 10, 3);
function rs_registration_form_validation($reg_errors, $sanitized_user_login, $user_email)
{
    global $woocommerce;
    $company_fields_required = (!empty($_POST['registration_type']) && 'company' === $_POST['registration_type']);
    $shipp_to_different_address = (!empty($_POST['register_ship_to_different_address']) && 1 == $_POST['register_ship_to_different_address']);
    $errors = false;
    $fields = rs_registration_form_fields();
    if ($shipp_to_different_address) {
        $fields += rs_registration_form_fields_address();
    }
    if (!$company_fields_required) {
        unset($fields['billing_company']);
        unset($fields['billing_nip']);
    }
    //Validate required
    foreach ($fields as $field => $settings) {
        if (false === isset($settings['required']) || true === $settings['required']) {
            if (empty($_POST[$field])) {
                $errors = true;
                wc_add_notice('Pole: <strong>'.$settings['label'].'</strong> jest wymagane.', 'error');
            }
        }
    }
    if ($errors) {
        return new WP_Error('registration-error', 'Proszę poprawić błędy w formularzu');
    }
    return $reg_errors;
}
add_action('woocommerce_created_customer', 'rs_registration_form_submit');
function rs_registration_form_submit($user_id)
{
    $fields = rs_registration_form_fields();
    $fields += rs_registration_form_fields_address();
    foreach ($fields as $field => $settings) {
        if (isset($_POST[$field]) && !empty($_POST[$field])) {
            update_user_meta($user_id, $field, $_POST[$field]);
        }
    }
}
add_filter('register_form', 'rs_registration_form');
function rs_registration_form()
{
    $fields = rs_registration_form_fields();
    include '_rs_registration_form.php';
}
add_filter('register_form_address', 'rs_registration_form_address');
function rs_registration_form_address()
{
    $fields = rs_registration_form_fields_address();
    include '_rs_registration_form.php';
}
add_filter('woocommerce_edit_address_slugs', 'rs_fix_address_slugs');
function rs_fix_address_slugs($slugs)
{
    $slugs['billing'] = 'billing';
    $slugs['shipping'] = 'shipping';
    return $slugs;
}
function rs_rejestracja_url()
{
    return get_permalink(244);
}
function rs_logowanie_url()
{
    return get_permalink(20);
}
function rs_show_checkout_progress_bar($step = '')
{
    include '_checkout_progress_bar.php';
}
function rs_order_form_buttons()
{
    include '_order_form_buttons.php';
}
add_filter('woocommerce_get_checkout_url', 'rs_get_checout_url');
function rs_get_checout_url($url) {
    if (is_user_logged_in()) {
        $url .= '#step1';
    }
    return $url;
}
include 'src/RS_Search.php';

我不知道WooCommerce,但我认为错误的结果是因为以下几行:

$company_fields_required = (!empty($_POST['registration_type']) && 'company' === $_POST['registration_type']);

if (!$company_fields_required) {
    unset($fields['billing_company']);
    unset($fields['billing_nip']);
}

在您提交"私人"表单且验证失败后,将再次加载您的字段。现在,在$_POST变量中,registration_type是否以某种方式设置为"company"?如果您只在函数开头打印$_POST['registration_type'],就可以对此进行测试。如果不是这样的话,那么我很确定这个错误发生在另一个函数中,因为到目前为止,这对我来说是有意义的。

编辑:再看一下你的代码,我认为没有一个发布的函数对这些不当行为负责。第一个函数只负责检查是否缺少一些发布的值,并说"嘿,这是一个错误"。必须有另一个函数来负责稍后显示在HTML中的字段。我认为你需要找到这个函数。