Пагинация и счетчик результатов в Woocommerce после пользовательского цикла

18 мая 2018 г., 22:17:11
Просмотры: 13.9K
Голосов: 1

Я пытаюсь правильно отобразить пагинацию и счетчик результатов после выполнения моего пользовательского запроса.

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

После изучения проблемы я обнаружил, что создал отдельный объект запроса вместо замены основного запроса. Я попытался исправить это, следуя руководству здесь: Как исправить пагинацию для пользовательских циклов?

... но это способ для WordPress, а мне нужно преобразовать это:

global $loop;

$args = array(
    'post_type' => 'product',
    'posts_per_page' => $per_page,
    'meta_query' => array(
        array(
            'key' => '_product_brand',
            'value' => $val,              
        )
    )     
);  

$loop = new WP_Query($args);

// Исправление пагинации
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $loop;

if ($loop->have_posts()) {
    while ($loop->have_posts()) : $loop->the_post();
        wc_get_template_part('content', 'product');  
    endwhile;
} else {
    echo __('Товары не найдены');
}

wp_reset_postdata();

$wp_query = NULL;
$wp_query = $temp_query;

...в функцию WooCommerce. Пока я пробовал изменить глобальную переменную $loop на $woocommerce_loop, но это вызывает ошибки.

Я также пробовал передать атрибут $paged следующим образом:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$args = array(
    'post_type' => 'product',
    'posts_per_page' => $per_page,
    'paged' => $paged,
    'meta_query' => array(
        array(
            'key' => '_product_brand',
            'value' => $val,              
        )
    )     
);

А также так:

$args['paged'] = (get_query_var('paged')) ? get_query_var('paged') : 1;

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

В чем проблема? Буду очень признателен за любую помощь, спасибо.

#РЕДАКТИРОВАНИЕ 1 После следования руководству CFX: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

Пагинация и счетчик результатов наконец заработали. Моей проблемой было использование WP_Query вместо wc_get_products.

Следуя документации WooCommerce для функции wc_get_products: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

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

$all_products = wc_get_products(array(
    'category' => array('suspension'),
    'price' => 59.99,
    'regular_price' => 59,
    'sale_price' => 159,               
));

Я пробовал передавать эти аргументы по одному, все согласно документации, но это не работает. Выдается следующая ошибка:

Warning: array_map(): Argument #2 should be an array in E:\xampp\apps\wordpress\htdocs\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-data-store-cpt.php on line 1673

Warning: array_filter() expects parameter 1 to be array, null given in E:\xampp\apps\wordpress\htdocs\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-data-store-cpt.php on line 1673

#РЕДАКТИРОВАНИЕ 2

аргументы:

$all_products = wc_get_products(array(
    'product_category' => 'suspension',
));

обработчик:

if (!empty($query_vars['product_category'])) {
    $query['tax_query'][] = array(
        'taxonomy' => 'product_cat',
        'terms' => esc_attr($query_vars['product_category']),
    );
    return $query;
}

Я хочу отобразить товары из родительской категории по заданному слагу. Этот код работает только если я передаю ID категории. Если я передаю слаг как аргумент (как в коде выше), цикл отображает все товары в магазине.

6
Комментарии

Извините, но ваш код не имеет никакого смысла... Нет никакого смысла в этой части: $wp_query = NULL; $wp_query = $loop;. Зачем присваивать NULL, если сразу после этого вы хотите присвоить другое значение. И зачем вообще что-то присваивать wp_query, если сразу после этого вы используете $loop для вывода записей...

Krzysiek Dróżdż Krzysiek Dróżdż
24 мая 2018 г. 01:18:17

Я сделал это, следуя руководству. Насколько я понимаю, обнуление основного запроса должно устранить потенциальные ошибки при переопределении. Затем назначение моего $loop в wp_query нужно для работы пагинации. Мой цикл выводит записи, но не влияет на оригинальный запрос, который отвечает за пагинацию и подсчет результатов. Я видел такой рабочий код в руководстве (ссылка приведена в вопросе выше), но мой случай немного отличается, потому что я использую WooCommerce вместо обычного WordPress.

Bartosz Was Bartosz Was
24 мая 2018 г. 15:17:31

Это абсолютно бессмысленно. Если вы присваиваете значение переменной, то просто присваиваете его - нет смысла делать это дважды. И если вы не модифицируете глобальную $wp_query, то нет смысла сохранять её во временных переменных и тому подобное. Смените руководство, потому что это действительно плохое - автор не понимает основ PHP и WP. PS. WooCommerce и другие сторонние плагины не по теме этого сайта.

Krzysiek Dróżdż Krzysiek Dróżdż
24 мая 2018 г. 15:26:03

Какой объект? Вы создаете этот цикл самостоятельно в своем коде...

Krzysiek Dróżdż Krzysiek Dróżdż
24 мая 2018 г. 15:30:38

Упрощая мое утверждение: $woocommerce_loop получает свои результаты откуда-то. Я думал, что это из wp_query (как в WordPress), но похоже, что он берет результаты из другого объекта, и я пытаюсь выяснить, какой именно это объект.

Bartosz Was Bartosz Was
24 мая 2018 г. 15:41:15

Да, я сделал. Я забыл изменить строку с глобальными переменными, поэтому было неясно, что я использую здесь 2 глобальных объекта: $loop и $wp_query... Я бы с радостью изменил руководство, но нет никаких примеров WooCommerce, которые я мог бы использовать. В любом случае, WooCommerce имеет какой-то объект, который отвечает за получение значений $woocommerce_loop (я предполагаю, что это основной цикл WooCommerce). В WordPress этим объектом был 'wp_query', но в WooCommerce аналогичные значения присваиваются другому $key. Я просто хочу найти этот ключ.

Bartosz Was Bartosz Was
24 мая 2018 г. 15:41:17
Показать остальные 1 комментариев
Все ответы на вопрос 1
14

Вы излишне усложняете синтаксис своих запросов, и WooCommerce даже не рекомендует использовать WP_Query() для получения товаров. Они утверждают, что это может привести к проблемам в будущем.

Недавно я написал статью о том, как правильно сделать то, что вам нужно, с примером вот здесь: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

24 мая 2018 г. 22:05:06
Комментарии

Да, это именно то, что я искал. Спасибо! Теперь мне нужно преобразовать все WP_Queries в wc_get_products. У меня к вам вопрос: вы использовали сложные запросы в своем проекте? Я имею в виду те, где указаны meta_key, meta_value, диапазон цен между заданными значениями и т.д.?

Bartosz Was Bartosz Was
25 мая 2018 г. 16:58:45

Я не пробовал этого, но возможно сработает. Попробуйте, и я постараюсь помочь, если возникнут проблемы.

cfx cfx
25 мая 2018 г. 20:45:15

Я обновил пост. Не могли бы вы посмотреть #EDIT1 и сказать, работают ли у вас эти аргументы?

Bartosz Was Bartosz Was
29 мая 2018 г. 14:38:51

Они не работают, но если я оформлю их как вы бы оформили WP_Query(), то запрос по таксономии работает нормально. Я не уверен, что именно вы пытаетесь сделать со значениями цены, но вам может понадобиться пользовательский ключ meta_query для достижения желаемого. Проверьте класс WC_Product_Query() на предмет допустимых аргументов.

cfx cfx
29 мая 2018 г. 20:14:22

Это странно, что базовые аргументы не работают. Похоже, мне нужно связаться со службой поддержки WooCommerce. Да, я решил проблему с ценами через meta_query. К вашему сведению, я использую цены с моими пользовательскими фильтрами - пользователь передает 'price_min' и 'price_max', а затем я отображаю продукты в заданном диапазоне цен. Теперь я просто размышляю, как решить проблему с категориями. Для категорий с заданным ID я использовал tax_query, но что делать с категориями с заданным slug? Для них аргумент category не работает...

Bartosz Was Bartosz Was
29 мая 2018 г. 23:07:21

category строго предназначен для нативной таксономии WordPress category. Если вам нужно фильтровать по таксономии product_cat, то вам потребуется tax_query, который, как я подтвердил, работает как ожидалось. Возможно, вам стоит опубликовать ваше готовое решение в виде обновления.

cfx cfx
29 мая 2018 г. 23:27:20

tax_query работает как ожидалось, но я могу передавать только ID родительской категории, а мне нужно передавать slug родительской категории в качестве аргумента. Я обязательно сделаю обновление для будущих читателей.

Bartosz Was Bartosz Was
29 мая 2018 г. 23:33:14

Не могли бы вы обновить информацию, предоставив текущий код, который у вас есть, а также подробности о том, что должно происходить, и детали о том, что происходит вместо этого?

cfx cfx
29 мая 2018 г. 23:37:49

Конечно, посмотрите #EDIT2.

Bartosz Was Bartosz Was
30 мая 2018 г. 00:04:48

Неясно, что вы пытаетесь сделать. Пожалуйста, предоставьте полный код. Если это шаблон страницы, включите его. Я не понимаю, зачем вы разделили это на "аргументы" и "обработчик", и что они должны означать.

cfx cfx
30 мая 2018 г. 01:14:12

Поскольку аргумент category не работает, я пытаюсь найти другой способ отобразить все товары из заданной категории. Поэтому я хочу передать slug категории в качестве аргумента.

Bartosz Was Bartosz Was
30 мая 2018 г. 01:27:45

Я нашел способ отобразить товары из категории, используя ID родительской категории, и добился этого с помощью tax_query. Теперь я хочу узнать, можно ли настроить tax_query так, чтобы передавать slug категории вместо ID. || product_category не является встроенным аргументом, поэтому WooCommerce рассматривает его как пользовательский, а пользовательские аргументы нужно обрабатывать вручную, точно так же, как пользовательские meta_keys (см. документацию)

Bartosz Was Bartosz Was
30 мая 2018 г. 02:03:05

...но что насчет result count? Кажется, что он не отображает правильное количество продуктов, полученных с помощью подхода @cfx. Насколько я понял, $total (woocommerce_result_count()) берется из wc_get_loop_prop( 'total' ), и я вижу, что мы изменили его на $products->total и только потом выполнили do_action('woocommerce_before_shop_loop');

Но $total в строке Showing x - x of x results не реагирует на это...

Able Able
20 нояб. 2018 г. 17:58:29

@Able у меня всё работает корректно. Если вы вставите Gist с полным кодом вашего шаблона, то я попробую разобраться, почему у вас это может не работать.

cfx cfx
20 нояб. 2018 г. 21:09:32
Показать остальные 9 комментариев