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

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

HIT

14.10.2016

9654

14

В связи с растущими потребностями к функционалу интернет-магазинов будем создавать востребованный функционал на базе плагина 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;

}
Вывести атрибут товара в виде поля для ввода. Стандартные атрибуты вводить довольно неудобно.
[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Исчезающие сообщения woocommerce

Исчезающие сообщения woocommerce

У woocommerce есть встроенная система сообщений: при добавлении товара в корзину, при удалении товара из корзины, при различных ошибках. Но они появляются перед основным контентом, нарушая исходную верстку. Сделаем их Читать далее »

Watermark для изображений товаров (обзор плагинов)

Watermark для изображений товаров (обзор плагинов)

Рассмотрим различные плагины по добавлению водяного знака (watermark) на изображения товаров. WooCommerce Products Image Watermark (BeRocket) Плагин не понравился. Логотип добавляется только одним способом, с указанием положения. Можно перезагрузить загруженные Читать далее »

Несколько менеджеров магазина

Несколько менеджеров магазина

Предположим что мы делаем интернет-магазин оптовой компании нацеленной работу с уже имеющимися клиентами. Есть ряд менеджером к котором прикреплены те или иные клиенты. Как сделать так, чтобы заказы распределялись между Читать далее »

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

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

  1. Олег

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

    1. Alexandr

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

      1. Олег

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

        1. 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

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

  2. Владимир

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

    1. 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

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

  4. Александр

    Спасибо большое! долго искал это. все работает!!! делал через атрибуты. для тех кто, как я, не очень в программировании нужно вставить functions.php темы: 
    add_filter( ‘woocommerce_cart_product_price’ , ‘custom_price’, 10, 2);add_filter( ‘woocommerce_get_price_html’ , ‘custom_price’, 10, 2);function custom_price( $price ){      global $post;        $unit = wp_get_object_terms($post->ID, ‘pa_edinitsa-izmereniya’);    if (!empty($unit)) {      $price .= »;    $price .= ‘ / ‘ ;     $price .= $unit[0]->name;    $price .= ‘</span></span>’;      }     return $price;}

  5. фффф

    Ничего нигде не добавляется…

  6. WorldWebs

    Не работает выдаёт Fatal error: Cannot redeclare woo_add_custom_general_fields()

    1. Alexandr

      Данная ошибка означает что функция woo_add_custom_general_fields() уже где-то объявлена. т.е. вы её прописали повторно.

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