Пользовательская проверка поля проверки в Woocommerce - PullRequest
0 голосов
/ 21 ноября 2018

Мой код:

add_action( 'woocommerce_before_checkout_form', 'fruit_field' );

function fruit_field( $checkout ) {

  woocommerce_form_field( 'fruit', array(
      'type'          => 'select',
      'required'      => true,
      'options'       => array(
        'apple'       => __('Apple'),
        'banana'      => __('Banana'),
        'watermelon'  => __('Watermelon'),
        'other'       => __('Other'),
      ),
      'class'         => array('my-class'),
      'label'         => __('Best fruit?'),
      ), $checkout->get_value( 'fruit' ));
}

И проверка:

add_action('woocommerce_checkout_process', 'process_checkout');

function process_checkout() {
  if ($_POST['fruit'] === null) {
    wc_add_notice( __( 'No fruits?' ), 'error' );
  }
}

После отправки формы всегда отображается моя ошибка «Нет фруктов?», Независимо от того, что было выбрано,$_POST['fruit'] как-то недоступно в функции process_checkout?

1 Ответ

0 голосов
/ 22 ноября 2018

Вы не можете использовать настраиваемые поля извлечения в хуке woocommerce_before_checkout_form, так как ваше поле находится вне формы проверки и оно не публикуется при отправке.

Вместо этого следует использовать woocommerce_checkout_before_customer_details вместо этого ловушка действий:

add_action( 'woocommerce_checkout_before_customer_details', 'fruit_custom_checkout_field' );
function fruit_custom_checkout_field() {

    woocommerce_form_field( '_fruit', array(
        'type'     => 'select',
        'label'    => __('Best fruit?'),
        'class'    => array('my-fruit'),
        'required' => true,
        'options'  => array(
            ''          => __('Chose a fruit'),
            'Apple'      => __('Apple'),
            'Banana'     => __('Banana'),
            'Watermelon' => __('Watermelon'),
            'Other'      => __('Other'),
        ),
    ), WC()->checkout->get_value('_fruit') );
}

add_action('woocommerce_checkout_process', 'process_fruit_custom_checkout_field');
function process_fruit_custom_checkout_field() {
    if (isset($_POST['_fruit']) && empty($_POST['_fruit']) ) {
        wc_add_notice( __( 'please choose a "fruits"' ), 'error' );
    }
}

// Save the custom checkout field in the order meta
add_action( 'woocommerce_checkout_create_order', 'save_fruit_custom_field_as_meta_data', 10, 2 );
function save_fruit_custom_field_as_meta_data( $order, $data ) {
    if (isset($_POST['_fruit']) && ! empty($_POST['_fruit']) ) {
        $order->update_meta_data('_custom_field', esc_attr( $_POST['_fruit'] ) );
    }
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы).Проверено и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...