Вывод самых популярных товаров

288
28 февраля 2017, 18:32

Подскажите, как заменить этот код шорткода на аналогичный код, в котором используется WP_Query?

echo do_shortcode('[best_selling_products per_page="12"]');

я делал так:

$args = array(
    'post_type' => 'product',
    'posts_per_page' => 12,
    'meta_key' => 'total_sales',
    'orderby' => 'meta_value_num',
);
$wc_query = new WP_Query($args);
if ($wc_query->have_posts()) {
while ($wc_query->have_posts()) {
    $wc_query->the_post();
    woocommerce_product_loop_start();
        wc_get_template_part( 'content', 'product' );
    woocommerce_product_loop_end();
    }
}
wp_reset_postdata();

но дело в том, что магазин находится ещё в разработке, а самые популярные товары уже выводятся в результате этого кода. Ведь товары ещё не продавались. Правильно ли я вывожу самые продаваемые товары?

Answer 1

Код правильный. Он выводит записи типа product по 12 на страницу, сортируя их по мета-полю total_sales. Пока продаж нет, у всех товаров это поле равно 0.

Значение мета-поля total_sales можно вывести в цикле после wc_get_template_parts, например:

echo get_post_meta(get_the_ID(), 'total_sales')[0];

Чтобы вывести товары, у которых число продаж больше заданного (в примере > 0), можно использовать meta_query. Два варианта цикла ниже.

echo '<h2>Самые продаваемые циклом woocommerce</h2>';
$args = array(
    'post_type' => 'product',
    'post_status' => 'publish',
    'posts_per_page' => 12,
    'meta_key' => 'total_sales',
    'orderby' => 'meta_value_num',
);
$wc_query = new WP_Query($args);
if ($wc_query->have_posts()) {
    while ($wc_query->have_posts()) {
        $wc_query->the_post();
        woocommerce_product_loop_start();
            wc_get_template_part( 'content', 'product' );
            echo 'Кол-во продаж: ' . get_post_meta(get_the_ID(), 'total_sales')[0];
        woocommerce_product_loop_end();
    }
}
wp_reset_postdata();
echo '<h2>Самые продаваемые циклом woocommerce с ограничением</h2>';
$args = array(
    'post_type' => 'product',
    'post_status' => 'publish',
    'posts_per_page' => 12,
    'orderby' => 'meta_value_num',
    'meta_query'     => array(
        array( // Simple products type
            'key'           => 'total_sales',
            'value'         => 0,
            'compare'       => '>',
            'type'          => 'numeric'
        ),
    ),
);
$wc_query = new WP_Query($args);
if ($wc_query->have_posts()) {
    while ($wc_query->have_posts()) {
        $wc_query->the_post();
        woocommerce_product_loop_start();
        wc_get_template_part( 'content', 'product' );
        echo 'Кол-во продаж: ' . get_post_meta(get_the_ID(), 'total_sales')[0];
        woocommerce_product_loop_end();
    }
}
wp_reset_postdata();

Результат теста здесь.

READ ALSO
Реальна ли минификация html на CMS Bitrix?

Реальна ли минификация html на CMS Bitrix?

Я думаю что многие знают способ минификации html с помощью php:

462
Как правильно реализовать корзина на PHP

Как правильно реализовать корзина на PHP

Друзья помогите реализовать корзину на PHPАлгоритм таков Администратор сайта добавляет товар через админку ,а затем товар попадает в базу...

286
Спецификация исключений C++

Спецификация исключений C++

Как сейчас правильно указывать, что функция выбрасывает исключения? Писать throw(

244