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

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

HIT

14.10.2016

6861

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;

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

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Отключаем стандартные метабоксы

Отключаем стандартные метабоксы

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

Woo Discount Rules PRO

Woo Discount Rules PRO

Обозреваем плагин Woo Discount Rules PRO, конфигурации акций и различные настройки плагина. Каждый второй товар бесплатно Сделаем категорию (например Компакт диски) в которой каждый второй товар будет бесплатным. Если товары Читать далее »

Хлебные крошки WC

Хлебные крошки WC

Хлебные крошки WC имеют свои особенности. Их невозможно заменить стандартными хлебными крошками, т.к. в них еще не предусмотрена система для иерархических таксономий. Выводим хлебные крошки Первым делом надо назначить хлебные Читать далее »

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

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() уже где-то объявлена. т.е. вы её прописали повторно.

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