/ Сайтостроение / Плагины / Единица измерения товара

Единица измерения товара

HIT

14.10.2016

2915

10

В связи с растущими потребностями к функционалу интернет-магазинов будем создавать востребованный функционал на базе плагина Woocommerce.

Единица измерения товара

Если необходимо выводить единицу товара (шт, кв.м, упаковка, пог.м, и т.д.), сделаем metabox для данного значения, в вкладке Woocommerce Основные. Поле можно задать текстовым или сделать список из вариантов.

Список из вариантов

add_action( 'woocommerce_product_options_shipping_product_data', 'woo_add_custom_general_fields' );
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' );

function woo_add_custom_general_fields() {

global $woocommerce, $post;
 
echo '<div class="options_group">';
// Add Select field in woocommerce
woocommerce_wp_select( 
array( 
	'id'      => '_select', 
	'label'   => __( 'Единица измерения', 'productunit' ), 
	'options' => array(
		'шт'   => __( 'шт', 'productunit' ),
		'пачка'   => __( 'пачка', 'productunit' ),
		'кв.м' => __( 'кв.м', 'productunit' )
		)
	)
);
echo '</div>'; }

Текстовое поле — Единица

add_action( 'woocommerce_product_options_shipping_product_data', 'woo_add_custom_general_fields' );
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' );

function woo_add_custom_general_fields() {

global $woocommerce, $post;
 
echo '<div class="options_group">'; 

// Add Text field in woocommerce 
woocommerce_wp_text_input( 
array( 
'id' => '_text_field', 
'label' => __( 'My Text Field', 'woocommerce' ), 
'placeholder' => 'http://', 
'desc_tip' => 'true', 
'description' => __( 'Enter the custom value here.', 'woocommerce' ) 
) 
); 

echo '</div>';}

Добавляем функцию сохранения значения (в зависимости от выбора реализации списком или текстом удаляем лишнее).

function woo_add_custom_general_fields_save( $post_id ){
	
	// Text Field
	$woocommerce_text_field = $_POST['_text_field'];
	if( !empty( $woocommerce_text_field ) )
	update_post_meta( $post_id, '_text_field', esc_attr( $woocommerce_text_field ) );
		
	// Select
	$woocommerce_select = $_POST['_select'];
	if( !empty( $woocommerce_select ) )
	update_post_meta( $post_id, '_select', esc_attr( $woocommerce_select ) );
	
}

Единица товара после цены

Создаем функцию привязки единицы измерения к цене.

add_filter( 'woocommerce_cart_product_price' , 'custom_price', 10, 2);
add_filter( 'woocommerce_get_price_html' , 'custom_price', 10, 2);

function custom_price( $price, WC_Product $product ){

$unit = get_post_meta( $product->get_ID(), '_select', true );

if ($unit) {

$price .= '<span class="woocommerce-Price-amount amount"><span class="product price amount rubl">';
$price .= ' / ' ;
$price .= $unit;
$price .= '</span></span>';

}

return $price;

}

Все это решение по внедрению единицы измерения имеет один недостаток — данное пользовательское поле не появляется в меню массового редактирования товаров.

28.04.18 В интерфейс массового редактирования можно добавлять и пользовательские поля. Но для различных случаев возможно и использование с помощью атрибута.

Единица измерения в виде атрибута

Немного меняем предыдущую функцию. pa_klass-zashhityi — slug нужного атрибута

function custom_price( $price, WC_Product $product ){

if (get_the_terms( $post->ID , 'pa_klass-zashhityi')) {
$units = get_the_terms( $post->ID , 'pa_klass-zashhityi');
foreach( $units as $unit ){
echo $unit->name;
}

$price .= '<span class="woocommerce-Price-amount amount"><span class="product price amount rubl">';
$price .= ' / ' ;
$price .= $unit->name;
$price .= '</span></span>';

}

return $price;

}

Обновленная (более короткая) функция прибавления к цене:

function custom_price( $price ){
  
    global $post;
    
    $unit = wp_get_object_terms($post->ID, 'pa_unit');  

  if (!empty($unit)) {  

	$price .= '';
	$price .= ' / ' ; 
	$price .= $unit[0]->name;
	$price .= '</span></span>';
	
  }
	  
    return $price;

}

Вывести атрибут товара в виде поля для ввода. Стандартные атрибуты вводить довольно неудобно.

Тэги:

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

  • Похожие записи
  • Комментарии
  • Вложения
Поле для вариативного товара

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

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

Вкладка Дополнительная информация

Вкладка Дополнительная информация

У товаров WC есть вкладка Дополнительная информация (Additional Information), в которой по-умолчанию выводятся атрибуты, вес и габариты товара. Добавим в эту вкладку дополнительные данные. Проверки содержит ли товар атрибуты, вес Читать далее »

Процесс заказа WC

Процесс заказа WC

Все что связано с процессом непосредственно заказа. Особенно после того как пользователь нажимает кнопку Оформить заказ. Редирект после оформления заказа После оформления стандартного заказа woocommerce происходит редирект на шаблон успешного Читать далее »

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

10 комментариев

  1. Олег

    Я не понял куда это вставлять?

    1. Alexandr
      Alexandr

      Это все функции. Вставлять можно в functions.php, либо подключить к functions отдельный файл с функциями woocommerce (я так делаю), либо можно сделать плагином.

      1. Олег

        добавил код из первого блока в function.php, который лежит в паке wp-includes, ни чего не происходит, может я туплю))) что то ведь еще нужно где то добавить, в файле php который выводит страницу настройки товара в админке?

        1. Alexandr
          Alexandr

          Вы не туда добавили. Вставлять надо в файл functions который находится в папке темы (site.ru/wp-content/themes/ваша_тема/functions.php). Если добавить только первый абзац ничего и не добавится. Первый и второй абзацы это варианты типов полей (текстовым и списком), далее надо добавить функцию сохранения поля и еще одна функция привязки нового поля к выводимой цене. В шаблонах WC редактировать ничего не нужно — все работает на хуках.

          1. Олег

            Александр, спасибо за ответы! Добавил вот такой код в function.php, который лежит в папке моего шаблона, шаблон у меня ColorMag

            add_action( ‘woocommerce_product_options_shipping_product_data’, ‘woo_add_custom_general_fields’ );
            add_action( ‘woocommerce_process_product_meta’, ‘woo_add_custom_general_fields_save’ );

            function woo_add_custom_general_fields() {

            global $woocommerce, $post;

            echo »;
            // Add Select field in woocommerce
            woocommerce_wp_select(
            array(
            ‘id’ => ‘_select’,
            ‘label’ => __( ‘Единица измерения’, ‘productunit’ ),
            ‘options’ => array(
            ‘шт’ => __( ‘шт’, ‘productunit’ ),
            ‘пачка’ => __( ‘пачка’, ‘productunit’ ),
            ‘кв.м’ => __( ‘кв.м’, ‘productunit’ )
            )
            )
            );
            echo »; }
            function woo_add_custom_general_fields_save( $post_id ){

            // Select
            $woocommerce_select = $_POST[‘_select’];
            if( !empty( $woocommerce_select ) )
            update_post_meta( $post_id, ‘_select’, esc_attr( $woocommerce_select ) );

            }

            add_filter( ‘woocommerce_cart_product_price’ , ‘custom_price’, 10, 2);
            add_filter( ‘woocommerce_get_price_html’ , ‘custom_price’, 10, 2);

            function custom_price( $price, WC_Product $product ){

            if (get_post_meta( $product->id, ‘_select’, true )) {

            $unit = get_post_meta( $product->id, ‘_select’, true );

            $price .= »;
            $price .= ‘ / ‘ ;
            $price .= $unit;
            $price .= »;

            }

            return $price;

            }

            К сожалению ни чего не изменилось((

          2. Alexandr
            Alexandr

            А в товаре у вас должно появилось нового поля (select). Заполните его для какого-либо товара, и тогда единица выведется после цены. Если поле не заполнено — ничего не выводится..

  2. Владимир

    У меня тоже не работает.
    Напрягает еще вот эта строка function custom_price( $price, WC_Product $product ), а именно WC_Product $product. Почему тут пробел?

    1. Alexandr
      Alexandr

      Сама запись такого вида
      function custom_price( $price, WC_Product $product )
      у меня работает корректно.

      По поводу того что не работает — попробуйте на промежуточных этапах «прозвонить» функции. На каком моменте не работает?!

  3. airy

    У вас в функции привязки единицы измерения к цене производится двойной запрос к базе данных:
    if (get_post_meta( $product->get_ID(), '_select', true )) {
    $unit = get_post_meta( $product->get_ID(), '_select', true );

    Лучше вот так:

    $unit = get_post_meta( $product->get_ID(), '_select', true );
    if ($unit) {
    }

    1. Alexandr
      Alexandr

      Вы абсолютно правы. Спасибо!
      Изменил функцию в посте.

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