Обновление 2
Попробуйте следующее (которое обычно добавляет раскрывающийся список на отдельных страницах товара и сохраняет / отображает выбранное значение в элементе корзины) :
// Frontend: custom select field (dropdown) in product single pages
add_action( 'woocommerce_before_add_to_cart_button', 'fabric_length_product_field' );
function fabric_length_product_field() {
global $product;
// Select field
woocommerce_form_field('fitting_color', array(
'type' => 'select',
'class' => array('my-field-class form-row-wide'),
'label' => __('_fitting_color', 'woocommerce'),
'required' => true, // or false
'options' => array(
'' => __('Select a color', 'woocommerce'),
'black' => __('Black', 'woocommerce'),
'white' => __('White', 'woocommerce'),
),
),'');
}
// Add "fitting_color" selected value as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 20, 2 );
function add_custom_cart_item_data( $cart_item_data, $product_id ){
if( isset($_POST['fitting_color']) && ! empty($_POST['fitting_color'])) {
$cart_item_data['fcolor']= array(
'value' => esc_attr($_POST['fitting_color']),
'unique_key' => md5( microtime() . rand() ), // <= Make each cart item unique
);
}
return $cart_item_data;
}
// Display custom cart item data in cart and checkout pages
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_item_data, $cart_item ) {
if ( isset( $cart_item['fcolor']['value'] ) ){
$cart_item_data[] = array(
'name' => __( 'Fitting color', 'woocommerce' ),
'value' => $cart_item['fcolor']['value'],
);
}
return $cart_item_data;
}
Код сохраняется в файле function.php вашей активной дочерней темы (или активной темы).Это должно работать.
Для сохранения / отображения заказа (и отображения в уведомлениях по электронной почте) , вы будете использовать:
// Save chosen slelect field value to each order item as custom meta data and display it everywhere
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_product_fitting_color', 10, 4 );
function save_order_item_product_fitting_color( $item, $cart_item_key, $values, $order ) {
if( isset($values['fcolor']['value']) ) {
$key = __('Fitting color', 'woocommerce');
$value = $values['fcolor']['value'];
$item->update_meta_data( $key, $value );
}
}
Ипроверка отсутствующего поля:
// Field validation
add_filter( 'woocommerce_add_to_cart_validation', 'dropdown_fitting_color_validation', 10, 3 );
function dropdown_fitting_color_validation( $passed, $product_id, $quantity ) {
if( isset($_POST['fitting_color']) && empty($_POST['fitting_color']) ) {
wc_add_notice( __( "Please select a Fitting color", "woocommerce" ), 'error' );
return false;
}
return $passed;
}