• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Вывод превью товаров по атрибуту в сайдбар

shantiom

Новичок
Всем доброго вечера! Вопрос: Как можно реализовать такую штуку:
Нужно на странице описания продукта, вывести превьюшки товаров (только картинки) с одинаковым атрибутом.

В качестве примера: Магазин картин, выбрал картину, справа в сайдбаре (под номером 1) отображаются все картины этого автора. Под номером 2 - все картины в таком же стиле как выбранная.
https://monosnap.com/file/SHInJrDN1EywCd7hHKj1Jh46z0OSH2

Под номером 1 выведены картины с одним и тем же автором
Под номером 2 выведены картины с одинаковым стилем
Номер 3 - как вывести имя автора.

Может есть плагин какой ?
Или подскажите в какую сторону копать ?
 

artemkomarov

Специалист
Местный
Привет. Это делается очень просто.
Получаем атрибуты товара через метод
Код:
$product->get_attributes();
Затем находим то что нам нужно по названию или slug как нравится с помощью метода
Код:
wc_get_product_terms();
Затем с помощью шорткода выводим товары с таким же атрибутом
Код:
array(
     'per_page' => '12',
     'columns' => '4',
     'orderby' => 'title',
     'order' => 'asc',
     'attribute' => '',
     'filter' => ''
 )

[product_attribute attribute='color' filter='black']
то же проделываем для номера 2.
И точно так же можно вывести имя автора получив его из присвоенных атрибутов.
 

shantiom

Новичок
Привет. Это делается очень просто.
Получаем атрибуты товара через метод
Код:
$product->get_attributes();
Затем находим то что нам нужно по названию или slug как нравится с помощью метода
Код:
wc_get_product_terms();
Затем с помощью шорткода выводим товары с таким же атрибутом
Код:
array(
     'per_page' => '12',
     'columns' => '4',
     'orderby' => 'title',
     'order' => 'asc',
     'attribute' => '',
     'filter' => ''
 )

[product_attribute attribute='color' filter='black']
то же проделываем для номера 2.
И точно так же можно вывести имя автора получив его из присвоенных атрибутов.

Что очень просто это уже хорошо ) Но я не особо программист .. Можно более подробную инструкцию ?
Готов отблагодарить за помощь.
 

shantiom

Новичок
И еще, может это поможет, у меня в шаблоне "flatsome" есть возможность сделать подобное. Там можно создать блок который выводит миниатюры по тегу а не по атрибуту. Визуально он делает все как надо, но выводит везде одно и тоже. А нужно что бы он показывал так: если атрибут "автор" текущего товара "Иванов" то выводим все товары где атрибут "автор"="Иванов"
 

iv18sh

Новичок
Тоже нуждаюсь в чуть более подробном объяснении что и куда вставить, чтобы заработало всё)
 

shantiom

Новичок
Привет. Это делается очень просто.
Получаем атрибуты товара через метод
Код:
$product->get_attributes();
Затем находим то что нам нужно по названию или slug как нравится с помощью метода
Код:
wc_get_product_terms();
Затем с помощью шорткода выводим товары с таким же атрибутом
Код:
array(
     'per_page' => '12',
     'columns' => '4',
     'orderby' => 'title',
     'order' => 'asc',
     'attribute' => '',
     'filter' => ''
 )

[product_attribute attribute='color' filter='black']
то же проделываем для номера 2.
И точно так же можно вывести имя автора получив его из присвоенных атрибутов.

Тоже нуждаюсь в чуть более подробном объяснении что и куда вставить, чтобы заработало всё)
Вот нашел видео:
Как я понял из него нужно в вставлять в functions.php в папке темы.
Но после того как я добавил это:

add_action('woocommerce_before_single_product_summary', 'sidebar_portfolio');
function sidebar_portfolio() {

$product->get_attributes();

}
возникает ошибка и страница не загружается.

Кто нибудь скажет я вообще в том направлении двигаюсь ? )))

p.s. Если пишу тест:
add_action('woocommerce_before_single_product_summary', 'sidebar_portfolio');
function sidebar_portfolio() {

echo 'test';

}

то работает, выводится слово тест там где надо.
 

shantiom

Новичок
Да в правильном. только надо добавить глобальную переменную в начало функции
Код:
global $product;
Спасибо за ответ, вроде сдвинулся с места !) Вот пока так получается:
Код:
add_action('woocommerce_before_single_product_summary', 'sidebar_portfolio');

function sidebar_portfolio() {
global $product;
$product->get_attributes();
print_r($product);
}

Выдает такое:
Код:
WC_Product_Simple Object ( [id] => 3218 [post] => WP_Post Object ( [ID] => 3218 [post_author] => 1 [post_date] => 2017-02-09 15:08:32 [post_date_gmt] => 2017-02-09 12:08:32 [post_content] => Жатва - процесс уборки злаковых культур при помощи серпа или голыми руками. Обычно рожь, пшеницу, ячмень повсюду жали серпом, считалось большим грехом косить пшеницу косой. Если плохую пшеницу нельзя было сжать серпом, её вырывали с корнем. [post_title] => Художник Иванов -1 [post_excerpt] => Краткое описание здесь! [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => %d1%85%d1%83%d0%b4%d0%be%d0%b6%d0%bd%d0%b8%d0%ba-%d0%b8%d1%82%d0%b8%d1%82%d1%8c%d0%b5%d0%b2 [to_ping] => [pinged] => [post_modified] => 2017-02-09 20:44:38 [post_modified_gmt] => 2017-02-09 17:44:38 [post_content_filtered] => [post_parent] => 0 [guid] => http://art-v-flatsome:8888/product/%d1%85%d1%83%d0%b4%d0%be%d0%b6%d0%bd%d0%b8%d0%ba-%d0%b8%d1%82%d0%b8%d1%82%d1%8c%d0%b5%d0%b2/ [menu_order] => 0 [post_type] => product [post_mime_type] => [comment_count] => 0 [filter] => raw ) [product_type] => simple [shipping_class:protected] => [shipping_class_id:protected] => 0 [total_stock] => [supports:protected] => Array ( [0] => ajax_add_to_cart ) [downloadable] => no [product_attributes] => Array ( [pa_color] => Array ( [name] => pa_color [value] => [position] => 0 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_style] => Array ( [name] => pa_style [value] => [position] => 1 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_width] => Array ( [name] => pa_width [value] => [position] => 2 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_height] => Array ( [name] => pa_height [value] => [position] => 3 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) [pa_painter] => Array ( [name] => pa_painter [value] => [position] => 4 [is_visible] => 1 [is_variation] => 0 [is_taxonomy] => 1 ) ) )

Дальше по плану:
Код:
wc_get_product_terms();
Но эта строка совсем не понятна...
Как пользоваться этим методом не знаю..

Как я понимаю далее надо получить значение атрибута "художник" (painter) для этого товара и по этому значению атрибута отсортировать то что нам нужно для вывода. И вывести.

Код:
array(
    'per_page' => '12',
    'columns' => '4',
    'orderby' => 'title',
    'order' => 'asc',
    'attribute' => '',
    'filter' => ''
 )

[product_attribute attribute='color' filter='black']

Это как я понял - массив, но что с ним делать тоже не ясно.

Короче осталась надежда только на Вас)
 

artemkomarov

Специалист
Местный
Это как я понял - массив, но что с ним делать тоже не ясно.
Далее получаем атрибут "автор" допустим
Код:
$attributes = $product->get_attributes();
foreach ( $attributes as $attribute ) {
    if ( empty( $attribute['is_visible'] ) || ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) ) {
        continue;
    }
    if ( $attribute['name']  ==  'pa_painter' ) {
        $values = wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) );
        $value = apply_filters( 'woocommerce_attribute', wpautop( wptexturize( $values[0] ) ), $attribute, $values );
        $shortcode = sprintf(
               '[product_attribute attribute="painter" filter="%1$s"]',
               $value
        );
        echo do_shortcode( $shortcode );
    }
}

код не тестировал не знаю будет ли работать. не уверен, что нужно писать название атрибута или его slug
 

shantiom

Новичок
Вау круто !! это готовый код) Спасибо огромнейшее! А то целый день сегодня только на это ушел))
Попробовал разобраться, вот что на данный момент получается:

Код:
<?php
add_action('woocommerce_before_single_product_summary', 'sidebar_portfolio');
function sidebar_portfolio() {
global $attributes, $product, $values, $value, $shortcode;

$attributes = $product->get_attributes();
foreach ( $attributes as $attribute ) {
    if ( empty( $attribute['is_visible'] ) || ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) ) {
        continue;
    }
    if ( $attribute['name']  ==  'pa_painter' ) {
        $values = wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) );
        $value = apply_filters( 'woocommerce_attribute', wpautop( wptexturize( $values[0] ) ), $attribute, $values );
        $shortcode = sprintf(
               '[product_attribute attribute="painter" filter="%1$s"]',
               $value
        );
        echo do_shortcode( $shortcode );

    }
}
}
Жирным выделил то что добавил, не знаю правильно или нет... в результате выдает вот такой шорт-код:

Код:
[product_attribute attribute="painter" filter="Иванов"]

Осталось разобраться с выводом картинок.
Предполагаю что теперь нужно с помощью какого то плагина создать миниатюры с галереей и вывести через этот шорт-код ?
 

shantiom

Новичок
shantiom и artemkomarov спасибо вам) всё работает

Здорово что помогло) Поделитесь вашим решением,интересно как выводить через этот шорт код миниатюры ?
Сейчас у меня выдает вот такое:
Код:
[product_attribute attribute="painter" filter="Иванов"]
И что дальше с этим делать пока не знаю...
Буду рад любым разъяснениям по этому вопросу)

В идеале хотелось бы сделать как на этом сайте:
http://art-icon.com/catalog/zhivopis/solnechnyy_labirint_belgorodskiy_prospekt/
https://monosnap.com/file/8qacBi4zLypqHW7GAj8lKyNqTnddrI
Там справа в сайтбаре 9 иконок, при нажатии появляется лайт бокс, и из лайт бокса есть ссылка на страницу магазина с этой картиной.

UPD
Прочитал эту ветку:
https://wpcommerce.ru/threads/shortcodes-shortkody-dlja-woocommerce.1811/
Понял что этот шорт код уже сам по себе должен выводить товары.
Но почему-то этого не происходит.
 
Последнее редактирование:

iv18sh

Новичок
Здорово что помогло) Поделитесь вашим решением,интересно как выводить через этот шорт код миниатюры ?
А у меня не через шорткод вывод идёт, я просто прописал в том коде, что выше скидывали, то место, где хотел бы видеть список товаров и они выводятся, меня вполне устраивает

Код:
add_action('woocommerce_after_single_product_summary', 'bikes_model');

Список мест брал отсюда https://businessbloomer.com/woocommerce-visual-hook-guide-single-product-page/
 
Сверху Снизу