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

Решено Сортировка товаров по произвольному полю ACF

Тема в разделе "Вопросы новичков", создана пользователем MrNix21, 3 окт 2016.

  1. MrNix21

    MrNix21

    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Всем доброго времени суток! При создании магазина, столкнулся проблемой, решение которого не могу найти, но кое-какие сдвиги в работе уже есть))) Сейчас товары выводятся как на рисунке 1, а надо как на рисунке 2
    Рис.1 1.jpg Рис.2 2.jpg
    Грунтование, оштукатуривание - это дополнительные поля в ACF. Для сортировки по этим полям, в файле functions.php использую этот код:
    Код:
    add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args' );
    function custom_woocommerce_get_catalog_ordering_args( $args ) {
      $orderby_value = isset( $_GET['orderby'] ) ? woocommerce_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
        if ( 'random_list' == $orderby_value ) {
            $args['orderby'] = 'for_sorting';//поле по которому сортируем
            $args['order'] = 'ASC';//по возрастанию (ASC) или убыванию (DESC)
            $args['meta_key'] = 'for_sorting';//по конкретному совпадению ключа
        }
        return $args;
    }
    add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby' );
    add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby' );
    function custom_woocommerce_catalog_orderby( $sortby ) {
        $sortby['random_list'] = 'Сортировка по произвольному полю';
        return $sortby;
    }
    а вывод в файле content-product.php делаю этим кодом:
    Код:
    <?php if($for_sorting=get_field("for_sorting")){echo $for_sorting;}?>
    <a href="<?php echo get_the_permalink(); ?>" class="sort-table-a">
    <table class="sort-table">
    <tr>
        <th>№</th>
        <th>Продукт</th>
        <th>Для чего используется</th>
        <th>Кол-во слоев</th>
        <th>Время высыхания</th>
        <th>Цена за мин.<br>упаковку</th>
    </tr>
    <tr>
        <td></td>
        <td><?php echo woocommerce_get_product_thumbnail(); do_action( 'woocommerce_shop_loop_item_title' );?></td>
        <td><?php if($why_use=get_field("why_use")){echo $why_use;}?></td>
        <td><?php if($sum_layers=get_field("sum_layers")){echo $sum_layers;}?></td>
        <td><?php if($time_drying=get_field("time_drying")){echo $time_drying;}?></td>
        <td><?php do_action( 'woocommerce_after_shop_loop_item_title' ); ?></td>
    </tr>
    </table>
    </a>
    Понимаю, что надо как-то переделать цикл вывода товаров, но не знаю как это делать, знаний не хватает. Может кто-то уже сталкивался с этим вопросом?
     
  2. MrNix21

    MrNix21

    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Неужто никто не знает решение?
     
  3. searchingman

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    553
    Баллы:
    113
    Алгоритм достаточно простой.
    1. Добавьте переменную, н-р, $old_for_sorting со старым значением $for_sorting. После вывода товара сохраняйте переменную $old_for_sorting.
    2. При выводе шапки и подвала сравнивайте обе переменные. Если они не равны, то нужно начинать новую таблицу.

    В итоге будет столько таблиц, сколько различных значений может быть в переменной $for_sorting.
     
    Последнее редактирование: 4 окт 2016
    • Нравится Нравится x 2
  4. MrNix21

    MrNix21

    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Спасибо, алгоритм понятен, но как теперь это реализовать? Надо же в файле content-product.php изменить алгоритм вывода товара, т.е. изменить вот это код:
    Код:
    <?php if($for_sorting=get_field("for_sorting")){echo $for_sorting;}?>
    <a href="<?php echo get_the_permalink(); ?>" class="sort-table-a">
    <table class="sort-table">
    <tr>
        <th>№</th>
        <th>Продукт</th>
        <th>Для чего используется</th>
        <th>Кол-во слоев</th>
        <th>Время высыхания</th>
        <th>Цена за мин.<br>упаковку</th>
    </tr>
    <tr>
        <td></td>
        <td><?php echo woocommerce_get_product_thumbnail(); do_action( 'woocommerce_shop_loop_item_title' );?></td>
        <td><?php if($why_use=get_field("why_use")){echo $why_use;}?></td>
        <td><?php if($sum_layers=get_field("sum_layers")){echo $sum_layers;}?></td>
        <td><?php if($time_drying=get_field("time_drying")){echo $time_drying;}?></td>
        <td><?php do_action( 'woocommerce_after_shop_loop_item_title' ); ?></td>
    </tr>
    </table>
    </a>
    Извините, но я не в силах написать этот простой скрипт(((
     
  5. MrNix21

    MrNix21

    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    С горем пополам сделал, возможно не так красиво и с ошибками, но тем не менее, результатом я доволен, выводится так, как мне нужно. Еще раз спасибо searchingman за наводку. Для тех, кому возможно понадобится, сортировка товара по произвольному полю ACF и группировка товара по этому же полю, привожу свое решение.
    Код:
    $i = 1;
                    while ( have_posts() ) : the_post(); ?>
    
                        <?php //wc_get_template_part( 'content', 'product' ); ?>
    
    
                        <?php if(get_field("for_sorting")){$for_sorting = get_field("for_sorting");}?>
                        
    
    <?php if ($for_sorting != $old) {?>
    <div class="for-sort"><?php echo $for_sorting; ?></div>
    <table class="sort-table">
    <tr>
        <th>№</th>
        <th>Продукт</th>
        <th>Для чего используется</th>
        <th>Кол-во слоев</th>
        <th>Время высыхания</th>
        <th>Цена за мин.<br>упаковку</th>
    </tr>
    <?php }
    $i++;
    if ($for_sorting != $old) {$i = 1;}?>
    <tr onclick="window.location.href='<?php echo get_the_permalink(); ?>'; return false">
        <td><?php echo $i;?></td>
        <td><?php echo woocommerce_get_product_thumbnail(); do_action( 'woocommerce_shop_loop_item_title' );?></td>
        <td><?php if($why_use=get_field("why_use")){echo $why_use;}?></td>
        <td><?php if($sum_layers=get_field("sum_layers")){echo $sum_layers;}?></td>
        <td><?php if($time_drying=get_field("time_drying")){echo $time_drying;}?></td>
        <td><?php do_action( 'woocommerce_after_shop_loop_item_title' ); ?></td>
    </tr>
    <?php if ($for_sorting == $old) {?>
    </table>
    <?php } ?>
    
    
                    <?php
    $old = $for_sorting;
    
                    endwhile; // end of the loop. 
    этот код разместил в файле archive-product.php
     
    • Победитель Победитель x 2
    • Полезно Полезно x 1
  6. MrNix21

    MrNix21

    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    По ходу создания сайта, выявились недочеты данного метода. Оказалось, что один товар может быть в нескольких категориях. При таком способе, который я сделал сейчас, невозможно сделать вывод одного товара на одной странице в нескольких категориях.
    [​IMG]
    Напомню, для названия таблиц (Грунтование, Оштукатуривание, Окрашивание) я использовал ACF. Т.е. допустим для товара указывал сортировку "Грунтование" и она сортировалась по нему. Сейчас выяснилось, что один и тот же товар может быть и в "Грунтовании" и "Окрашивании" и их таким способом вывести не получится (Так как товару можно прописать только одно значение) Соответственно, получается что "Грунтование, Оштукатуривание, Окрашивание" надо тоже сделать подкатегориями категориии "Краски". Поэтому вопрос к знатокам: Как вывести дочерние категории родительской категории вместе с товарами?
     
  7. MrNix21

    MrNix21

    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Неужто никто не сталкивался с этим?