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

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

Тема в разделе "Вопросы, советы и доработки.", создана пользователем SheihSin, 6 ноя 2015.

  1. SheihSin

    SheihSin

    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    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()

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

    SheihSin

    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Код в функции следующий:
    ------------------------------------------------------------------------
    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;

    }
    }
     
  3. SheihSin

    SheihSin

    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Кажется понял, почему ниже в цикле выводит списком сам себя, т.к. происходит считывание адреса URL, в котором указан вывод конкретной карточки товара. И уходит в бесконечный вызов сам себя, а функия "loop_end" видимо не срабатывает ...
     
  4. searchingman

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    552
    Баллы:
    113
    Не увидел, где у Вас функция и код запроса к товарам по части наименования товара, равного артикулу текущего товара. Если функциональности по умолчанию нет, то ее нужно самому написать.
     
  5. SheihSin

    SheihSin

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

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

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

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

    SheihSin

    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Функцию "woocommerce_content_analog()" описал в файле:
    /wp-content/plugins/woocommerce/includes/wc-template-functions.php

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

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

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    552
    Баллы:
    113
    В каком месте карточки товара должна быть выведена таблица и какие в ней должны быть поля?
     
  8. SheihSin

    SheihSin

    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Ниже описания товара и его полей, в центре, в любом месте.

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

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

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    552
    Баллы:
    113
    Примерное решение от которого можно оттолкнуться.
    Вставьте код в 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
     
    • Нравится Нравится x 1
  10. SheihSin

    SheihSin

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

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

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

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

    SheihSin

    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Возможно, вот в этом шаблоне определяется breadcrumbs:
    /wp-content/plugins/woocommerce/includes/class-wc-breadcrumb.php
     
  12. searchingman

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    552
    Баллы:
    113
    Чтобы исключить из поиска товар из текущей карточки, то параметры запроса
    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
                
    );
     
    • Нравится Нравится x 1
  13. searchingman

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    552
    Баллы:
    113
    Посмотрите возможное решение по изменению пермалинков.
     
  14. SheihSin

    SheihSin

    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Добрый день!
    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. Сегодня-завтра мне обещали денег подкинуть за магазин. Хотелось бы вас тоже как-то отблагодарить за помощь в написании запроса, могу кинуть через сбербанк. Можете дать номер сберкарты? Жду ответа, в личку наверное.
     
    • Это здорово! Это здорово! x 1
  15. searchingman

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    552
    Баллы:
    113
    Мета-поля в 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
     
    • Нравится Нравится x 2
  16. SheihSin

    SheihSin

    Сообщения:
    10
    Симпатии:
    0
    Баллы:
    1
    Ларчик просто открывался... всё было в _
    ))

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