/ Плагины / Поле для вариативного товара

Поле для вариативного товара

HIT

01.08.2018

1984

Как делать произвольные (пользовательские) поля для товаров Woocommerce описано здесь. Но теперь пойдем дальше — сделаем поле для вариативного товара. Это должно открыть горизонты для интересных решений. Но я предвижу сложность в реализации вывода данного поля во фронтенде.

Создание и сохранение поля для вариации

// Add Variation Settings
add_action( 'woocommerce_product_after_variable_attributes', 'variation_settings_fields', 10, 3 );
// Save Variation Settings
add_action( 'woocommerce_save_product_variation', 'save_variation_settings_fields', 10, 2 );

// Create new fields for variations
function variation_settings_fields( $loop, $variation_data, $variation ) {
 // Text Field
 woocommerce_wp_text_input( 
 array( 
 'id'          => '_text_field[' . $variation->ID . ']', 
 'label'       => __( 'My Text Field', 'woocommerce' ), 
 'placeholder' => 'http://',
 'desc_tip'    => 'true',
 'description' => __( 'Enter the custom value here.', 'woocommerce' ),
 'value'       => get_post_meta( $variation->ID, '_text_field', true )
 )
 );
 // Number Field
 woocommerce_wp_text_input( 
 array( 
 'id'          => '_number_field[' . $variation->ID . ']', 
 'label'       => __( 'My Number Field', 'woocommerce' ), 
 'desc_tip'    => 'true',
 'description' => __( 'Enter the custom number here.', 'woocommerce' ),
 'value'       => get_post_meta( $variation->ID, '_number_field', true ),
 'custom_attributes' => array(
 'step'  => 'any',
 'min' => '0'
 ) 
 )
 );
 // Textarea
 woocommerce_wp_textarea_input( 
 array( 
 'id'          => '_textarea[' . $variation->ID . ']', 
 'label'       => __( 'My Textarea', 'woocommerce' ), 
 'placeholder' => '', 
 'description' => __( 'Enter the custom value here.', 'woocommerce' ),
 'value'       => get_post_meta( $variation->ID, '_textarea', true ),
 )
 );
 // Select
 woocommerce_wp_select( 
 array( 
 'id'          => '_select[' . $variation->ID . ']', 
 'label'       => __( 'My Select Field', 'woocommerce' ), 
 'description' => __( 'Choose a value.', 'woocommerce' ),
 'value'       => get_post_meta( $variation->ID, '_select', true ),
 'options' => array(
 'one'   => __( 'Option 1', 'woocommerce' ),
 'two'   => __( 'Option 2', 'woocommerce' ),
 'three' => __( 'Option 3', 'woocommerce' )
 )
 )
 );
 // Checkbox
 woocommerce_wp_checkbox( 
 array( 
 'id'            => '_checkbox[' . $variation->ID . ']', 
 'label'         => __('My Checkbox Field', 'woocommerce' ), 
 'description'   => __( 'Check me!', 'woocommerce' ),
 'value'         => get_post_meta( $variation->ID, '_checkbox', true ), 
 )
 );
 // Hidden field
 woocommerce_wp_hidden_input(
 array( 
 'id'    => '_hidden_field[' . $variation->ID . ']', 
 'value' => 'hidden_value'
 )
 );
}

// Save new fields for variations
function save_variation_settings_fields( $post_id ) {
 // Text Field
 $text_field = $_POST['_text_field'][ $post_id ];
 if( ! empty( $text_field ) ) {
 update_post_meta( $post_id, '_text_field', esc_attr( $text_field ) );
 }
 
 // Number Field
 $number_field = $_POST['_number_field'][ $post_id ];
 if( ! empty( $number_field ) ) {
 update_post_meta( $post_id, '_number_field', esc_attr( $number_field ) );
 }
 // Textarea
 $textarea = $_POST['_textarea'][ $post_id ];
 if( ! empty( $textarea ) ) {
 update_post_meta( $post_id, '_textarea', esc_attr( $textarea ) );
 }
 
 // Select
 $select = $_POST['_select'][ $post_id ];
 if( ! empty( $select ) ) {
 update_post_meta( $post_id, '_select', esc_attr( $select ) );
 }
 
 // Checkbox
 $checkbox = isset( $_POST['_checkbox'][ $post_id ] ) ? 'yes' : 'no';
 update_post_meta( $post_id, '_checkbox', $checkbox );
 
 // Hidden field
 $hidden = $_POST['_hidden_field'][ $post_id ];
 if( ! empty( $hidden ) ) {
 update_post_meta( $post_id, '_hidden_field', esc_attr( $hidden ) );
 }
}

Вывод поля во фронтенде

Добавляем значение поля в массив вариации:

// Add New Variation Settings
add_filter( 'woocommerce_available_variation', 'load_variation_settings_fields' );

//Add custom fields for variations
function load_variation_settings_fields( $variations ) {
 
 // duplicate the line for each field
 $variations['text_field'] = get_post_meta( $variations[ 'variation_id' ], '_text_field', true );
 
 return $variations;
}

Изменяем шаблон вывода информации вариативного товара (woocommerce/single-product/add-to-cart/variation.php), добавив в него

<div class="woocommerce-variation-custom-text-field">
{{{ data.variation.text_field }}}
</div>

Теперь при выборе вариации значение поля будет выводиться там, где мы его установили.

Благодарность за решение Реми Корсон, ссылка на источник.

Но пока от этого поля польза нулевая, т.к. для доп. информации поле итак было. Нужно подумать как его использовать. Например в виде единицы товара, только для вариации.

Пример: цена за кг

Будем выводить у вариаций цену за килограмм. Для того чтобы получить значение у вариаций должны быть заполнены поля вес и цена. В данном случае кастомные поля заводить не нужно.

Делаем расчет и создаем новые данные для вывода в вариации (проверяем чтобы поля цена и вес были заполнены):

// Расчет и вывод цены за кг (для вариативных товаров)
add_filter( 'woocommerce_available_variation', 'bbloomer_add_custom_field_variation_data' );
function bbloomer_add_custom_field_variation_data( $variations ) {
	$product = wc_get_product($variations['variation_id']);
	$price = $product->get_price();
	$weight = $product->get_weight();
	if ( !empty($price) && !empty($weight) ) {
		$price_per_weight = round ($price / $weight);
		$variations['price_per_weight'] = '<strong>'.$price_per_weight.'</strong> руб. за кг';
	}
	return $variations;
}

Добавляем в шаблон woocommerce/single-product/add-to-cart/variation.php вывод новых данных:

<div class="woocommerce-variation-price_per_weight">
{{{ data.variation.price_per_weight}}}
</div>

Вывод цены за кг для простого товара:

// Расчет и вывод цены за кг (для простых товаров)

function add_price_by_wheight() { 
	global $product; 
	$price = $product->get_price();
	$weight = $product->get_weight();
	if ( !empty($price) && !empty($weight) ) {
		$price_per_weight = round ($price / $weight);
		echo '<strong>'.$price_per_weight.'</strong> руб. за кг';
	}	
} 

add_action( 'woocommerce_single_product_summary', 'add_price_by_wheight', 12 );

Тэги:

Поделится информацией с друзьями

  • Похожие записи
  • Комментарии
  • Вложения
Бонусная система

Бонусная система

Система лояльности покупателей — один из сильнейших маркетинговых инструментов. Рассмотрим бонусная систему как один из вариантов реализации системы лояльности. Будем начислять за покупки (либо любые другие действия) балы, которыми покупатель Читать далее »

Разные шаблоны для разных категорий товаров

Разные шаблоны для разных категорий товаров

Учимся создавать разные шаблоны товаров для разных категорий. Данная технология пригодиться в оформлении принципиально разных по подаче товаров. Также на основе этого можно создавать посадочные страницы категорий, создавая им любое Читать далее »

Отделить категории от товаров

Отделить категории от товаров

В архивах woocommerce выводит категории и товары в один список (если включить настройку выводить категории и товары). Но нам, например, необходимо категории оформить по другому. Для этого нужно отделить категории Читать далее »

Добавить комментарий

Пока нет комментариев. Будь первым!

Поле для вариативного товара
Изменение объекта при скроллинге
Рекомендации для васИзменение объекта при скроллингеOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.