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

Вывод в карточке товаров таблицы с аналогами...

Image CMS

SheihSin

Новичок
#1
Здравствуйте. Уже весь мозг сломал! Что только не делал...
Плагинов перепробовал - кучу! но не один не пошёл...

А нужно то - всего ничего!
Чтобы при отображении карточки товара ниже отображалась таблица со всеми товарами, у которых в наименовании присутствует артикул текущего товара.

То есть, если в каталоге товаров допустим есть товары:
Наименование: Абра01 (абра02, абра05, абра07, абра09) / артикул: Абра01
Наименование: Абра03 (абра01, абра02, абра03, абра07) / артикул: Абра03
Наименование: Абра06 (абра01, абра02, абра03, абра09) / артикул: Абра06

то при входе в карточку товара Абра01, ниже в таблице отобразились товары Абра03 и Абра06, т.к. у них в наименовании товара есть строковые совпадения в виде абра01

Карточка товара где строится - нашёл:
/wp-content/plugins/woocommerce/templates/content-single-product.php

Нашёл где строится вывод каталога товаров:
/wp-content/plugins/woocommerce/includes/wc-template-functions.php

Сейчас пытаюсь запустить цикл, аналогично функции woocommerce_content(), создал на базе неё
woocommerce_content_analog()

Вызываю эту процедуру, и отображение уходит в как-то рекурсивную функцию - текущий товар начинает выводится в цикле до бесконечности...
 

SheihSin

Новичок
#2
Код в функции следующий:
------------------------------------------------------------------------
if ( ! function_exists( 'woocommerce_content_analog' ) ) {
function woocommerce_content_analog() { ?>

<?php if ( apply_filters( 'woocommerce_show_page_title', true ) ) : ?>
<h1 class="page-title"><?php woocommerce_page_title(); ?></h1>
<?php endif; ?>



<?php do_action( 'woocommerce_archive_description' ); ?>
<?php if ( have_posts() ) : ?>
<?php echo('<br>do_action(woocommerce_before_shop_loop)'); ?>
<?php do_action('woocommerce_before_shop_loop'); ?>

<?php woocommerce_product_loop_start(); ?>
<?php woocommerce_product_subcategories(); ?>

<?php //while ( have_posts() ) : the_post(); ?>
<?php //wc_get_template_part( 'content', 'product' ); ?>
<?php //endwhile; // end of the loop. ?>



<?php woocommerce_product_loop_end(); ?>
<?php do_action('woocommerce_after_shop_loop'); ?>
<?php elseif ( ! woocommerce_product_subcategories( array( 'before' => woocommerce_product_loop_start( false ), 'after' => woocommerce_product_loop_end( false ) ) ) ) : ?>
<?php wc_get_template( 'loop/no-products-found.php' ); ?>
<?php endif;

}
}
 

SheihSin

Новичок
#3
Кажется понял, почему ниже в цикле выводит списком сам себя, т.к. происходит считывание адреса URL, в котором указан вывод конкретной карточки товара. И уходит в бесконечный вызов сам себя, а функия "loop_end" видимо не срабатывает ...
 

searchingman

Гуру
Местный
#4
Не увидел, где у Вас функция и код запроса к товарам по части наименования товара, равного артикулу текущего товара. Если функциональности по умолчанию нет, то ее нужно самому написать.
 

SheihSin

Новичок
#5
Спасибо что ответили! Функция запроса - это следующий для меня этап.
Для начала, я примитивно хотел хотя бы просто вывести весь имеющийся каталог товаров, загруженный в WP

Пока что, у меня периодически глючит даже вызов моей функции из файла "content-single-product.php" после строчки "do_action( 'woocommerce_single_product_summary' );"

Вызов функции делаю так: <?php woocommerce_content_analog(); ?>

Как мне правильно все это сделать?
 

SheihSin

Новичок
#6
Функцию "woocommerce_content_analog()" описал в файле:
/wp-content/plugins/woocommerce/includes/wc-template-functions.php

после функции "woocommerce_content()" и аналогично ей
Это правильно я сделал?

Может в файле "content-single-product.php" проще loop организовывать?
 

searchingman

Гуру
Местный
#7
В каком месте карточки товара должна быть выведена таблица и какие в ней должны быть поля?
 

SheihSin

Новичок
#8
Ниже описания товара и его полей, в центре, в любом месте.

Поля - подгруппа товара, артикул, производитель, цена для конкретной роли, в наличии остаток на складе.

Сейчас это всё выводится только для текущей карточки товара.
Думаю, надо как-то сделать чтобы хлебные крошки выводились по артикулу.
 
Последнее редактирование:

searchingman

Гуру
Местный
#9
Примерное решение от которого можно оттолкнуться.
Вставьте код в functions.php своей темы.
PHP:
function my_woocommerce_after_single_product_summary() {
    global $product;
    if ($sku = $product->get_sku()) { // проверяем, задан ли артикул товара
            $args = array(
            'post_type'            => 'product',
            'ignore_sticky_posts'  => 1,
            'no_found_rows'        => 1,
            'orderby'              => 'title',
            'order'                => 'ASC',
            's'                    => $sku
            );

        $products = new WP_Query( $args );
        if ( $products->have_posts() ) {
            echo  "<h3>Товары для артикула: $sku </h3>";
            echo '<table><tr><th>##</th><th>Наименование</th><th>Цена</th></tr>';
            $count_table = 1;
            while ( $products->have_posts() ) {
                $products->the_post();
                $product_title = '<a href="'.get_permalink().'">'.get_the_title().'</a>';
                global $product;
                $product_price = wc_price($product->get_price());
                echo "<tr><td>$count_table</td><td>$product_title</td><td>$product_price</td></tr>";
                $count_table++;
            }
            echo '</table>';  
        }
        wp_reset_postdata();  
    }
}
add_filter('woocommerce_after_single_product_summary', 'my_woocommerce_after_single_product_summary', 13 );
Пример вывода для темы storefront http://take.ms/Z8J5q
 

SheihSin

Новичок
#10
Кажется, всё начинает работать как надо!
Единственное, он сам себя (возможно) в аналогах вроде выводит, пока разбираюсь почему!!

Респект огромнейший и спасибо гигантское лично Вам и этому форуму!!!

И ещё, хочу сделать, чтобы SKU в хлебных крошках (breadcrumbs) фигурировал, т.е. в URL товар указывался и определялся по артикулу, а не по наименованию. Все SKU будут уникальные..
Сейчас URL создается на основе наименования товара, с заменой на транскрипцию, и адрес карточки товара через
находится www.sitename.ru/tovar/naimenovanei-tovara

Возможно ли сделать быстрой настройкой WooCommerce , чтобы товар в URL по SKU определялся ? Или надо копать функцию "get_permalink()" ?
 

SheihSin

Новичок
#11
Возможно, вот в этом шаблоне определяется breadcrumbs:
/wp-content/plugins/woocommerce/includes/class-wc-breadcrumb.php
 

searchingman

Гуру
Местный
#12
Единственное, он сам себя (возможно) в аналогах вроде выводит, пока разбираюсь почему!!
Чтобы исключить из поиска товар из текущей карточки, то параметры запроса
PHP:
            $args = array(
            'post_type'            => 'product',
            'ignore_sticky_posts'  => 1,
            'no_found_rows'        => 1,
            'orderby'              => 'title',
            'order'                => 'ASC',
            's'                    => $sku
            );
замените на
PHP:
            $args = array(
            'post_type'            => 'product',
            'ignore_sticky_posts'  => 1,
            'no_found_rows'        => 1,
            'post__not_in'         => array( $product->id ),
            'orderby'              => 'title',
            'order'                => 'ASC',
            's'                    => $sku
            );
 
#14
Добрый день!
1. В общем, пермалинки я победить не смог. Похоже, они формируются на этапе выгрузки товаров из 1С, привязаны к товарам, и простой коррекции не подлежат.
Прослеживается взаимосвязь URL-адреса товара с полем ЯРЛЫК в свойствах товара в WooCommerce.
Плагин использовал "WooCommerce and 1C:Enterprise/1С:Предприятие Data Exchange", Версия 0.7, Автор: Данил Семеленов.
Наверное, надо ковырять плагин в файле "woocommerce-and-1centerprise-data-exchange/woocommerce-1c.php"

2. Не получился вывод таблицы, сортируя по цене по DESC. Прописал: orderby => meta_value_num, meta_key => price
Товары вообще тогда перестают выводиться. Пробовал вместо price указывать regular_price - не помогло.

3. Сегодня-завтра мне обещали денег подкинуть за магазин. Хотелось бы вас тоже как-то отблагодарить за помощь в написании запроса, могу кинуть через сбербанк. Можете дать номер сберкарты? Жду ответа, в личку наверное.
 

searchingman

Гуру
Местный
#15
2. Не получился вывод таблицы, сортируя по цене по DESC. Прописал: orderby => meta_value_num, meta_key => price
Товары вообще тогда перестают выводиться. Пробовал вместо price указывать regular_price - не помогло.
Мета-поля в WooCommerce, как правило, начинаются с "_" ('_price', '_regular_price' и т.д.)
Поэтому, чтобы работала сортировка по числовому мета-полю '_price' параметры запроса должны быть такими.
PHP:
            $args = array(
            'post_type'            => 'product',
            'ignore_sticky_posts'  => 1,
            'no_found_rows'        => 1,
            'post__not_in'         => array( $product->id ),
            'meta_key'                => '_price',
            'orderby'              => 'meta_value_num',
            'order'                => 'ASC',
            's'                    => $sku
            );
Пример, выглядит так http://take.ms/4jXeU
 
#16
Ларчик просто открывался... всё было в _
))

Заработало, вы реально ГУРУ! спасибо огромное!
 

trim74

Новичок
#17
Добрый день

Подскажите пожалуйста, как подредактировать эту функцию в этой теме?

Условие одно, нужно чтобы в таблице отображались товары у которых совпадает атрибут
 
Сверху Снизу