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

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

HIT

01.08.2018

4306

Как делать произвольные (пользовательские) поля для товаров 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 );
[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Субкатегории в категориях Woocommerce

Субкатегории в категориях Woocommerce

В шаблоне вывода категорий Woocommerce к каждой категории можно выводить список субкатегорий. Для этого в шаблоне content-product_cat.php, перед закрывающим тегом /li вставляем следующее CSS стили списка субкатегорий

Юр. или физ. лицо при оформлении

Юр. или физ. лицо при оформлении

Расширим функционал Woocommerce выбором при оформлении заказа: юр. или физ. лицо. Естественно данный выбор будет влиять на множество аспектов самого процесса заказа и прочих функций WC. Создание переключателя и полей Читать далее »

/
Акции Woocommerce

Акции Woocommerce

В современном интернет-магазине необходимо постоянно проводить стимулирующие мероприятия — акции. Реализуем различные механизмы акций на движке Woocommerce. Акция (скидка) на категорию Если нам необходимо сделать скидку на всю категорию товаров. Читать далее »

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

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

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