В интернет-магазине 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_ (в функции выделено жирным)
Данная функция делает так, что атрибут с значением появляется в карточке товара под кнопкой «Добавить в корзину» на манер категорий и меток. Значение является ссылкой на архив.
Если мы хотим вывести миниатюру (термина) атрибута (если атрибут например бренд — логотип), то после строки
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);
[site-socialshare]
Здравствуйте!Как выровнять расположение сетки миниатюр товара на странице товара вровень с главной фотографией?Чтоб не было отступов ни слева ни справа. То-есть чтоб вторичные фото под главной картинкой располагались по ширине главной.
Самый простой и быстрый способ — задать списку миниатюр CSS свойства:
ol.flex-control-nav.flex-control-thumbs {
display: flex;
justify-content: space-between;
}
Скажите пожалуйста, а куда это прописать?
В css темы попробовал — не сработало.
Я думаю, что родные стили WC перебивают. Попробуйте проставить стилям свойство !important. И еще важно, чтобы версия WC была как минимум 3.0, т.к. с этой версии существенно переработались стили. А я предлагаю решение именно для последней версии.
У меня версия 2.6.14, откатился назад до этой версии после обновления, так как не понравилась новая галерея и перевод весь слетел.
ol.flex-control-nav.flex-control-thumbs {
display: flex !important;
justify-content: space-between !important;
}
Не помогло, к сожалению…
Конечно в той версии другие стили. Посмотрите какие классы формируют список миниатюр и примените к нему стили которые я предложил. Или еще проще, сделайте как Вам нужно через Инструменты разработчика и перенесите стили в тему.
Я не знаю как это сделать, может Вы подскажете?
Вот пример страницы https://glamface.ru/shop/brands/shik-brands/stojka-podstavka-dlya-xraneniya-i-sushki-kistej-dlya-makiyazha-shik/
Я попробовал сделать по простому (через Инструменты разработчика Google Chrome — почитайте об этом инструменте браузера), но начинает лезть верстка.. Нужно смотреть верстку и стили более глубоко. У меня, к сожалению, нет на это времени.
Можно ли вывести атрибуты для простого товара в woocommerce?
Добрый день! Дело в том, что есть товар, у которого есть 35 разных размеров, но все по одной цене. Есть ли возможность выводить атрибут размера, не переводя товар в вариативный (где как раз для всех 35 приходится вписывать одну и туже цену).
Спасибо.
Вам не нужно создавать вариативный товар. Просто назначайте товару атрибуты, без галки «используется для вариаций». Атрибуты по умолчанию в woocommerce будут выводиться во вкладке «Дополнительная информация», но можно вывести где-угодно (описано в статье выше).
Здравствуйте!
Кто-нибудь знает, как упорядочить сами таксономии атрибутов (pa_attribute)? То есть, надо выставить их порядок в админке и чтобы они в этом же порядке выводились в карточке товара. Не путать с порядков терминов/значений внутри атрибута!
Заранее спасибо, если кто поможет! )
А как создать такие атрибуты? https://i.imgur.com/vaWgXTR.pngЗаранее благодарен.
К сожалению не подскажу, не сталкивался с подобным решением.