Я пытаюсь woocommerce_checkout_init
два пользовательских поля проверки, добавленные с помощью фильтра woocommerce_checkout_init
, только когда я применяю фильтр woocommerce_checkout_fields
для woocommerce_checkout_fields
полей, он не распознает их, и они равны null
.
Я думаю, это потому, что фильтр woocommerce_checkout_init
идет после woocommerce_checkout_fields
.
Как я могу это решить?
Вот мой код:
add_action( 'woocommerce_checkout_init', 'wc_add_confirm_email_checkout', 10, 2 ); function wc_add_confirm_email_checkout( $checkout ) { $checkout->checkout_fields['billing']['billing_email2'] = array( 'type' => 'text', 'label' => __( 'Confirm Email Address', 'woocommerce' ), 'required' => true, 'placeholder' => _x( 'Confirm Email Address', 'placeholder', 'woocommerce' ) ); } add_action( 'woocommerce_checkout_init', 'wc_add_confirm_password_checkout', 10, 2 ); function wc_add_confirm_password_checkout( $checkout ) { //var_dump($checkout->checkout_fields); if ( get_option( 'woocommerce_registration_generate_password' ) == 'no' ) { $checkout->checkout_fields['account']['account_password2'] = array( 'type' => 'password', 'label' => __( 'Confirm password', 'woocommerce' ), 'required' => true, 'placeholder' => _x( 'Confirm Password', 'placeholder', 'woocommerce' ) ); } } add_filter('woocommerce_checkout_fields','reorder_woo_fields'); function reorder_woo_fields($fields) { $fields2['billing']['billing_first_name'] = $fields['billing']['billing_first_name']; $fields2['billing']['billing_last_name'] = $fields['billing']['billing_last_name']; $fields2['billing']['billingooglg_email'] = $fields['billing']['billing_email']; $fields2['billing']['billing_email2'] = $fields['billing']['billing_email2']; $fields2['billing']['account_password'] = $fields['account']['account_password']; $fields2['billing']['account_password2'] = $fields['account']['account_password2']; $fields2['billing']['billing_address_1'] = $fields['billing']['billing_address_1']; $fields2['billing']['billing_postcode'] = $fields['billing']['billing_postcode']; var_dump($fields2); //return $fields2; }
Для WooCommerce 3+ (обновление) :
Поскольку поля проверки WooCommerce 3.0 немного изменились, невозможно изменить порядок полей.
Существует новый аргумент «приоритет», который обрабатывает порядок полей , поля проверки и поля моей учетной записи.
Вот полнофункциональный пример для WooCommerce 3+:
// REORDERING CHECKOUT BILLING FIELDS (WOOCOMMERCE 3+) add_filter( "woocommerce_checkout_fields", "reordering_checkout_fields", 15, 1 ); function reordering_checkout_fields( $fields ) { ## ---- 1. REORDERING BILLING FIELDS ---- ## // Set the order of the fields $billing_order = array( 'billing_first_name', 'billing_last_name', 'billing_email', 'billing_phone', 'billing_company', 'billing_address_1', 'billing_address_2', 'billing_postcode', 'billing_city', 'billing_state', 'billing_country' ); $count = 0; $priority = 10; // Updating the 'priority' argument foreach($billing_order as $field_name){ $count++; $fields['billing'][$field_name]['priority'] = $count * $priority; } ## ---- 2. CHANGING SOME CLASSES FOR BILLING FIELDS ---- ## $fields['billing']['billing_email']['class'] = array('form-row-first'); $fields['billing']['billing_phone']['class'] = array('form-row-last'); $fields['billing']['billing_postcode']['class'] = array('form-row-first'); $fields['billing']['billing_city']['class'] = array('form-row-last'); ## ---- RETURN THE BILLING FIELDS CUSTOMIZED ---- ## return $fields; }
Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
До WooCommerce 3
Я не совсем уверен, но у вас есть некоторые вещи, которые вы не можете сделать, как объединение полей фактурирования с полями учетной записи. Если вы хотите сделать это, это будет намного сложнее, чем то, что вы пытаетесь сделать здесь. В этом случае вам нужно будет переписать / создать некоторые шаблоны выписки …
Другое дело, что billing_email
и billing_phone
используют billing_email
и billing_phone
же строку вместе с 'class' => 'form-row-first'
и 'class' => 'form-row-last'
. Если этот класс не задан 'class' => 'form-row-wide'
… Так что вам тоже нужно переопределить этот 'class'
.
После этого вам не нужно использовать 'woocommerce_checkout_init'
hook …
Вы все равно можете использовать 'woocommerce_checkout_fields'
.
Также вы можете объединить все их в одну функцию следующим образом:
/* * Creating, overriding and reordering custom fields. */ add_filter( "woocommerce_checkout_fields", "custom_override_checkout_fields", 11, 1 ); function custom_override_checkout_fields( $fields ) { // Creating 'billing_email2' field $fields['billing']['billing_email2'] = array( 'type' => 'text', 'label' => __( 'Confirm Email Address', 'woocommerce' ), 'placeholder' => _x( 'Confirm Email Address', 'placeholder', 'woocommerce' ), 'required' => true, 'class' => array('form-row-last'), 'clear' => true ); // =======> I don't really know if you need this one <======== // it already exist (see in first reference link at bottom). // Creating 'account_password2' field if ( get_option( 'woocommerce_registration_generate_password' ) == 'no' ) { $fields['account']['account_password2'] = array( 'type' => 'password', 'label' => __( 'Confirm password', 'woocommerce' ), 'placeholder' => _x( 'Confirm Password', 'placeholder', 'woocommerce' ), 'required' => true, 'class' => array('form-row-wide') //, // 'clear' => true ); } // Overriding existing billing_phone field 'class' property $fields['billing']['billing_phone']['class'] = array('form-row-wide'); // Reordering billing fields $order = array( "billing_first_name", "billing_last_name", "billing_email", "billing_email2", "billing_phone", "billing_company", "billing_address_1", "billing_address_2", "billing_postcode", "billing_country" ); foreach($order as $field) { $ordered_fields[$field] = $fields["billing"][$field]; } $fields["billing"] = $ordered_fields; return $fields; }
Код идет в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
Как я уже говорил, я думаю, что вы не можете объединить поля счетов с полями учетной записи.
Поскольку 'account_password2'
уже существует, если вы ссылаетесь на официальную документацию (см. Ниже в первой ссылке ссылки), вам может и не понадобиться ее создавать. Вам придется протестировать это и настроить его. Но это способ сделать это.
Рекомендации: