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

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

MrNix21

Новичок
Всем доброго времени суток! При создании магазина, столкнулся проблемой, решение которого не могу найти, но кое-какие сдвиги в работе уже есть))) Сейчас товары выводятся как на рисунке 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>
Понимаю, что надо как-то переделать цикл вывода товаров, но не знаю как это делать, знаний не хватает. Может кто-то уже сталкивался с этим вопросом?
 

searchingman

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

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

MrNix21

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

В итоге будет столько таблиц, сколько различных значений может быть в переменной $for_sorting.
Спасибо, алгоритм понятен, но как теперь это реализовать? Надо же в файле 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>
Извините, но я не в силах написать этот простой скрипт(((
 

MrNix21

Новичок
С горем пополам сделал, возможно не так красиво и с ошибками, но тем не менее, результатом я доволен, выводится так, как мне нужно. Еще раз спасибо 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
 

MrNix21

Новичок
По ходу создания сайта, выявились недочеты данного метода. Оказалось, что один товар может быть в нескольких категориях. При таком способе, который я сделал сейчас, невозможно сделать вывод одного товара на одной странице в нескольких категориях.

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