/ Плагины / Атрибуты товара WC

Атрибуты товара WC

HIT

19.10.2016

14550

13

В интернет-магазине Woocommerce есть функционал атрибутов. Атрибуты товара — это дополнительные поля для различных значений. Атрибуты бывают 2-х типов: текстовый (text) и с выбором значения (select).

Архив значения атрибута

Для значений атрибутов можно задать архив, в котором будут выводится все товары с таким значением данного атрибута.
Вставляем функцию в functions.php

add_action( 'woocommerce_product_meta_end', 'cj_show_attribute_links' );

function cj_show_attribute_links() {
	global $post;
	$attribute_names = array( 'pa_atributtovara', 'pa_svojstvo-tovara' );

	foreach ( $attribute_names as $attribute_name ) {
		$taxonomy = get_taxonomy( $attribute_name );

		if ( $taxonomy && ! is_wp_error( $taxonomy ) ) {
			$terms = wp_get_post_terms( $post->ID, $attribute_name );
			$terms_array = array();
			if ( ! empty( $terms ) ) {
				foreach ( $terms as $term ) {
					$archive_link = get_term_link( $term->slug, $attribute_name );
					$full_line = '<a href="' . $archive_link . '">'. $term->name . '</a>';
					array_push( $terms_array, $full_line );
				}
				echo '<span class="attribute">' . $taxonomy->labels->name . ' ' . implode( $terms_array, ', ' ). '</span>';
			}
		}
	}
}

Необходимые к выводу атрибуты прописываем с префиксом pa_ (в функции выделено жирным)

Данная функция делает так, что атрибут с значением появляется в карточке товара под кнопкой «Добавить в корзину» на манер категорий и меток. Значение является ссылкой на архив.

При желании можно сделать, чтоб все атрибуты выводились автоматически: надо внедрить в функцию $product->get_attributes();

Если мы хотим вывести миниатюру (термина) атрибута (если атрибут например бренд — логотип), то после строки

echo '<span class="attribute">' . $taxonomy->labels->name . ' ' . implode( $terms_array, ', ' ). '</span>';

надо добавить

echo wp_get_attachment_image( $term->term_image, 'full' );

Значения атрибута в пункте меню

Чтобы добавить возможность выводить ссылки на архивы значений атрибутов в меню — добавляем следующий код:

add_filter('woocommerce_attribute_show_in_nav_menus', 'wc_reg_for_menus', 1, 2);

function wc_reg_for_menus( $register, $name = '' ) {
     if ( $name == 'pa_atributtovara' ) $register = true;
     return $register;
}

pa_atributtovara — Атрибут, значения которого можно выводить в меню.

Отключить определенный атрибут

Если нам необходимо отключить вывод конкретного атрибута, делаем это так:

function the_remove_attributes( $attributes ) {

  unset( $attributes['pa_brend'] );
  unset( $attributes['oborudovanie'] );
  unset( $attributes['shtrihkod'] );

    return $attributes;
}
add_filter( 'woocommerce_product_get_attributes', 'the_remove_attributes' );

Атрибуты товара во вкладке Дополнительная информация

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

При массовом добавлении значений атрибута это также можно сделать: в меню Bulk Edit в строке после выбора значения есть падающий список (нужно выбрать and set) и поставить галку в чекбоксе Visible on p. p.

Проверка — есть ли атрибут

Сделаем простую проверку — заполнен ли у данного товара определенный атрибут или нет

$protect = wp_get_object_terms($post->ID, 'pa_tolshhina'); 

if( ( $protect[0]->name ) ) {
	echo 'Атрибут есть';
} else {
	echo 'Атрибута нет';	
}

Данный код будет работать в шаблоне товара (content-single-product.php), если необходимо вызывать в другом месте — нужно подключать глобальную переменную global $post.

И еще про выводы атрибутов от WP_Panda:

Вот так выводить один атрибут без пустых терминов

$tax = 'pa_заданный_вами_слаг_атрибута'
$pa_args = get_terms( $tax, array(
		'hide_empty' => false,
    )
 );

Вывести все атрибуты без пустых терминов

$pa_args = array();
    $attribute_taxonomies = wc_get_attribute_taxonomies();
    if ( 0 !== count( $attribute_taxonomies ) ) {
        foreach ( $attribute_taxonomies as $one_tax ) {
            $pa_args[] = get_terms( $one_tax, array(
                    'hide_empty' => false,
                ) );
        }
    }

Вывести атрибуты

Каждый атрибут приходится выводить по отдельности, из-за названия таксономии атрибута.

// Выводим основные атрибуты
function enter_main_attributes() {
	global $product;
	
	echo '<table class="woocommerce-product-attributes shop_attributes shop_attributes_main">';
	
	$naznachenie = wp_get_object_terms($product->get_id(), 'pa_naznachenie');
	if (!empty($naznachenie)) {
		echo '<tr class="woocommerce-product-attributes-item">';
		foreach ($naznachenie as $item) { $naznachenie_all[] = $item->name; }
		echo '<th class="woocommerce-product-attributes-item__label"><span>Назначение</span></th>';
		echo '<td class="woocommerce-product-attributes-item__value">'.implode(', ', $naznachenie_all).'</td>';
		echo '</tr>';
	}	
	
	$upakovka = wp_get_object_terms($product->get_id(), 'pa_upakovka');
	if (!empty($upakovka)) {
		echo '<tr class="woocommerce-product-attributes-item">';		
		foreach ($upakovka as $item) { $upakovka_all[] = $item->name; }
		echo '<th class="woocommerce-product-attributes-item__label"><span>Упаковка</span></th>';
		echo '<td class="woocommerce-product-attributes-item__value">'.implode(', ', $upakovka_all).'</td>';
		echo '</tr>';		
	}
	
	echo '</table>';
}

add_action( 'woocommerce_after_single_product_summary', 'enter_main_attributes', 5 );

Добавить что-либо во вкладку Детали

Добавить какие-либо данные, например из произвольных полей, во вкладку Детали можно так

// Вывести во вкладке атрибуты поля
add_action( 'woocommerce_product_additional_information', 'add_product_compaund_field_tab', 30 );
function add_product_compaund_field_tab(){
	global $product;
	$package = get_post_meta( $product->get_id(), '_package', 1 );
	$equipment = get_post_meta( $product->get_id(), '_equipment', 1 );
	if ( !empty($package) || !empty($equipment) ) {
		
		echo '<table class="woocommerce-product-attributes shop_attributes"><tbody>';

		if ( !empty($package) ) {
		echo '<tr class="woocommerce-product-attributes-item">
			<th class="woocommerce-product-attributes-item__label">Размер в упаковке</th>
			<td class="woocommerce-product-attributes-item__value"><p>'.$package.'</p></td>
		</tr>';
		}	
		
		if ( !empty($equipment) ) {
		echo '<tr class="woocommerce-product-attributes-item">
			<th class="woocommerce-product-attributes-item__label">Комплектация</th>
			<td class="woocommerce-product-attributes-item__value"><p>'.$equipment.'</p></td>
		</tr>';			
		}

		echo '</tbody></table>';
		
	}
}

Поля будут выведены после таблицы атрибутов, причем они будут выведены в виде таблицы. Но они будут в отдельной таблице. Чтобы новые поля выводились именно в той же таблицы, нужно изменять файл woocommerce/single-product/product-attributes.php добавляя в массив $product_attributes свои значения:

$package = get_post_meta( $product->get_id(), '_package', 1 );
$equipment = get_post_meta( $product->get_id(), '_equipment', 1 );

$product_attributes['package'] = array('label' => 'Размер в упаковке', 'value' => $package);
$product_attributes['equipment'] = array('label' => 'Комплектация', 'value' => $equipment);

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

  • Похожие записи
  • Комментарии
  • Вложения
Список меток текущей категории

Список меток текущей категории

Формируем и выводим список меток текущей категории. Вариант в файл funсtion.php function get_category_tags($cats) { global $wpdb; $tags = $wpdb->get_results (" SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name, t2.count as Читать далее »

/
Интересные фишки для Woocommerce

Интересные фишки для Woocommerce

Продолжаем серию интересных доработок для Woocmmerce. Выведем дату последней покупки товара У товара такого мета поля нет, нужно сопоставлять наименования (перебирая заказы). Для этого создаем запрос на перебор БД: В Читать далее »

Подарок за покупку

Подарок за покупку

Изучим и рассмотрим такой инструмент продаж как подарок за покупку. Вариантов такого поощрения может быть масса: подарок при покупке конкретного товара (из конкретной категории), подарок при наборе в корзине определенной Читать далее »

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

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

  1. Torcedor

    Здравствуйте!Как выровнять расположение сетки миниатюр товара на странице товара вровень с главной фотографией?Чтоб не было отступов ни слева ни справа. То-есть чтоб вторичные фото под главной картинкой располагались по ширине главной.

    1. Alexandr

      Самый простой и быстрый способ — задать списку миниатюр CSS свойства:
      ol.flex-control-nav.flex-control-thumbs {
      display: flex;
      justify-content: space-between;
      }

      1. Torcedor

        Скажите пожалуйста, а куда это прописать?
        В css темы попробовал — не сработало.

        1. Alexandr

          Я думаю, что родные стили WC перебивают. Попробуйте проставить стилям свойство !important. И еще важно, чтобы версия WC была как минимум 3.0, т.к. с этой версии существенно переработались стили. А я предлагаю решение именно для последней версии.

          1. Torcedor

            У меня версия 2.6.14, откатился назад до этой версии после обновления, так как не понравилась новая галерея и перевод весь слетел.
            ol.flex-control-nav.flex-control-thumbs {
            display: flex !important; 
            justify-content: space-between !important;
             
            }
             
            Не помогло, к сожалению…

          2. Alexandr

            Конечно в той версии другие стили. Посмотрите какие классы формируют список миниатюр и примените к нему стили которые я предложил. Или еще проще, сделайте как Вам нужно через Инструменты разработчика и перенесите стили в тему.

  2. Torcedor

     Я не знаю как это сделать, может Вы подскажете?
    Вот пример страницы https://glamface.ru/shop/brands/shik-brands/stojka-podstavka-dlya-xraneniya-i-sushki-kistej-dlya-makiyazha-shik/

    1. Alexandr

      Я попробовал сделать по простому (через Инструменты разработчика Google Chrome — почитайте об этом инструменте браузера), но начинает лезть верстка.. Нужно смотреть верстку и стили более глубоко. У меня, к сожалению, нет на это времени.

  3. Дмитрий

    Можно ли вывести атрибуты для простого товара в woocommerce?
    Добрый день! Дело в том, что есть товар, у которого есть 35 разных размеров, но все по одной цене. Есть ли возможность выводить атрибут размера, не переводя товар в вариативный (где как раз для всех 35 приходится вписывать одну и туже цену).
    Спасибо.

    1. Alexandr

      Вам не нужно создавать вариативный товар. Просто назначайте товару атрибуты, без галки «используется для вариаций». Атрибуты по умолчанию в woocommerce будут выводиться во вкладке «Дополнительная информация», но можно вывести где-угодно (описано в статье выше).

  4. Евгений

    Здравствуйте!
    Кто-нибудь знает, как упорядочить сами таксономии атрибутов (pa_attribute)? То есть, надо выставить их порядок в админке и чтобы они в этом же порядке выводились в карточке товара. Не путать с порядков терминов/значений внутри атрибута!
    Заранее спасибо, если кто поможет! )

  5. Serii

     А как создать такие атрибуты? https://i.imgur.com/vaWgXTR.pngЗаранее благодарен.

    1. Alexandr

      К сожалению не подскажу, не сталкивался с подобным решением.

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