Показать настраиваемые поля оформления заказа WooCommerce с помощью WP_Query

#php #wordpress #woocommerce #checkout #custom-fields

#php #wordpress #woocommerce #Оформить покупку #пользовательские поля

Вопрос:

Я использую плагин для создания некоторых пользовательских полей B2B. Теперь мне нужно, чтобы эти пользовательские поля отображались на странице оформления заказа.

 function add_custom_b2b_fields_checkout( $fields ){

  $args = array(
    'post_type'           => 'afreg_fields',
    'post_status'         => 'publish',
    'posts_per_page'      => '99',
    'orderby'             => 'name',
  );

  $get_b2b_fields = new WP_Query( $args );

  if ($get_b2b_fields->have_posts()) : while ($get_b2b_fields->have_posts()) : $get_b2b_fields->the_post();
    $fields['billing'][$get_b2b_fields->post_name] = array(
        'type'              => 'text',
        'label'             => get_the_title(),
        'placeholder'       => __(" ", "woocommerce"),
        'class'             => array('b2b-field'),
        'required'          => false,
    );
    endwhile;
    return $fields;
  endif;
}
add_filter( 'woocommerce_checkout_fields', 'add_custom_b2b_fields_checkout' );
 

Код работает почти хорошо. Но он показывает только последнее поле, как будто while выполняется правильно, но return $fields показывает только первое настраиваемое поле вместо всех.

Как я могу показать все поля вместо одного? Я попытался добавить a .= в $fields , но это не сработало.

Ответ №1:

В вашем коде есть небольшая ошибка, так как $get_b2b_fields->post_name он пуст.

Просто замените:

 $fields['billing'][$get_b2b_fields->post_name] = array(
 

с:

 $fields['billing'][$get_b2b_fields->post->post_name] = array(
 

Теперь это будет работать.

Комментарии:

1. Ты молодец! Я бы никогда не подумал, что мне пришлось использовать ->post там другое. Спасибо!

Ответ №2:

 add_filter( 'woocommerce_checkout_fields', 'add_custom_b2b_fields_checkout' );
 

измените его на

 add_action( 'woocommerce_checkout_fields', 'add_custom_b2b_fields_checkout' );
 

и добавьте do_action('woocommerce_checkout_fields'); на страницу, где вы хотите показать