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

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

HIT

14.10.2016

4333

11

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

}

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

Тэги:

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

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

Metabox woocommerce

У плагина woocommerce есть набор дополнительных полей при редактировании товара. При необходимости можно в группы полей WC добавить свои произвольные metabox. Должно получится так: Создание и отображение metabox Первый экшн Читать далее »

/
Отключаем лишний функционал Woocommerce

Отключаем лишний функционал Woocommerce

Отключаем невостребованные функции Woocommerce, чтобы было легче работать, не захламлять админку и не путать заказчиков. Отключить типы товаров Удалить чекбоксы виртуальный и загружаемый товары Удалить их также из фильтра админки:

Upgrade WC

Upgrade WC

Очередная серия улучшений (upgrade) плагина WC. Буду добавлять по мере изучения новые решения. Поиск по SKU (артикулу) Из коробки WC не ищет по артикулам (SKU). Но достаточно установить плагин Search Читать далее »

/

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

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

  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

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

  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;}

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