Я добавляю пользовательские поля проверки WooCommerce в файле functions.php
дочерней темы Storefront.
Они имеют «обязательный» атрибут.
Цель состоит в том, чтобы эти поля отображались в верхней части страницы перед полями биллинга.
при нажатии кнопки «Отправить», чтобы перейти к оплате, я получаю требуемую ошибку проверки правильного поля («пожалуйста, заполните свое имя») и не может продолжить оплату, даже если заполнение поля действительными данными.
Любой ключ, как исправить это или где начать отладку?
вот код в functions.php
:
add_action( 'woocommerce_before_checkout_form', 'my_custom_checkout_fields' ); function my_custom_checkout_fields( $checkout ) { echo '<div id="my_custom_checkout_field" class="col4-set"><h2>' . __('name') . '</h2>'; woocommerce_form_field( 'developer_name', array( 'type' => 'text', 'class' => array('developer_name-class form-row form-row-first'), 'label' => __('name'), 'placeholder' => __('fill in your name'), 'required' => true, ), $checkout->get_value( 'developer_name' )); echo '</div>'; } /** * Process the checkout */ add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process'); function my_custom_checkout_field_process() { // Check if set, if its not set add an error. if ( ! $_POST['developer_name'] ) wc_add_notice( __( 'please fill in your name' ), 'error' ); }
Я попробовал следующее, но никто из них не помог:
1. изменение:
if ( ! $_POST['developer_name'] )
в
if ( empty( $_POST['developer_name']) )
2. изменение триггера с:
add_action( 'woocommerce_before_checkout_form', 'my_custom_checkout_fields' );
в
add_action( 'woocommerce_after_checkout_form', 'my_custom_checkout_fields' );
3. Обновление до последней версии Woocomerce 3.0.5
Я запускаю WordPress 4.7.4
дополнительные связанные активные плагины:
Uni CPO – WooCommerce Варианты расчета и расчета цены
Как вы можете прочитать в woocommerce_before_checkout_form
hook, это до формы woocommerce_before_checkout_form
(так вне формы woocommerce_before_checkout_form
). По этой причине это настраиваемое поле не может работать в этом режиме .
Вы можете использовать вместо woocommerce_checkout_update_order_meta
действие hook, внося некоторые небольшие изменения в ваш код, поскольку в нем нет аргумента $ checkout.
Это отобразит поле «вверху страницы» перед полями биллинга » …
Таким образом, ваш полный код должен быть теперь:
/** * Add the field to the checkout */ add_action( 'woocommerce_checkout_before_customer_details', 'my_custom_checkout_fields' ); function my_custom_checkout_fields() { echo '<div id="my_custom_checkout_field" class="col4-set"><h2>' . __('name') . '</h2>'; woocommerce_form_field( 'developer_name', array( 'type' => 'text', 'class' => array('developer_name-class form-row form-row-first'), 'label' => __('name'), 'placeholder' => __('fill in your name'), 'required' => true, ), WC()->checkout->get_value( 'developer_name' )); echo '</div>'; } /** * Process the checkout */ add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process'); function my_custom_checkout_field_process() { // Check if set, if its not set add an error. if ( ! $_POST['developer_name'] ) wc_add_notice( __( 'Please fill in your name.' ), 'error' ); } // Update the order meta with field value add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta', 10, 1 ); function my_custom_checkout_field_update_order_meta( $order_id ) { if ( ! empty( $_POST['developer_name'] ) ) { update_post_meta( $order_id, 'Developer name', sanitize_text_field( $_POST['developer_name'] ) ); } } // Display the custom-field in orders view add_action( 'woocommerce_order_details_after_customer_details', 'display_my_custom_field_in_orde_details', 10, 1 ); function display_my_custom_field_in_orde_details( $order ) { $developer_name = get_post_meta( $order->get_id(), 'Developer name', true ); if ( ! empty( $developer_name ) ): ?> <table class="woocommerce-table woocommerce-table--customer-details shop_table customer_details"> <tbody><tr> <th>Developer name:</th> <td><?php echo $developer_name; ?></td> </tr></tbody> </table> <?php endif; }
Этот код находится в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
Этот код проверен и работает для WooCommerce версии 3.0+
Вы пробуйте этот код. Протестировано Ok
add_action( 'woocommerce_billing_fields', 'my_custom_checkout_fields' ); function my_custom_checkout_fields( $fields ) { $fields['billing_developer_name'] = array( 'label' => __('Developer name', 'woocommerce'), 'placeholder' => _x('Developer name', 'placeholder', 'woocommerce'), 'required' => TRUE, 'clear' => false, 'type' => 'text', 'class' => array('my-css') ); return $fields; }
Вы можете организовать его с помощью этого фрагмента
add_filter("woocommerce_checkout_fields", "order_fields"); function order_fields($fields) { $order = array( "billing_developer_name", "billing_first_name", "billing_last_name", "billing_company", "billing_address_1", "billing_address_2", "billing_postcode", "billing_country", "billing_email", "billing_phone" ); foreach($order as $field) { $ordered_fields[$field] = $fields["billing"][$field]; } $fields["billing"] = $ordered_fields; return $fields; }
Посмотреть скриншот