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

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

MrNix21

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

searchingman

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

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

MrNix21

Новичок
#4
Алгоритм достаточно простой.
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

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

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

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