Список WooCommerce самых продаваемых продуктов без шорткода - PullRequest
2 голосов
/ 12 марта 2019

Итак, я пытался сделать то же самое, что и шорткод [products limit="10" columns="4" best_selling="true" ].

Мне нужно внедрить его в шаблон страницы php, но я прочитал, что do_shortcode - плохая практика,и я хотел бы сделать это правильно.

Это то, что у меня есть до сих пор, но куда мне идти отсюда?

$args = array(
        'limit' => '10',
        'columns'      => '4',
        'orderby' => 'total_sales',
        'order' => 'DESC',
);
$products = wc_get_products( $args );

Если я правильно понимаю, это спасет10 самых продаваемых продуктов, убыв по количеству общих продаж в $ продуктов.Разве это не правильно?

Как правильно отобразить фактические списки товаров из $ products (как это сделал бы шорткод)?

1 Ответ

1 голос
/ 12 марта 2019

total_sales может быть установлено в запросе с помощью meta_key.

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

$args = array(
        'limit'     => '10',
        'orderby'   => array( 'meta_value_num' => 'DESC', 'title' => 'ASC' ),
        'meta_key'  => 'total_sales',
    );

    $query    = new WC_Product_Query( $args );
    $products = $query->get_products();
    if ( $products ) {
        foreach ( $products as $product ) {
            echo $product->get_name(); // Here, we're just listing each product's name
        }
    } else {
        echo __( 'No products found' );
    }

Обновление

В этом обновлении мы теперь используем результаты wc_get_products() для пользовательского шаблона страницы , адаптированного из archive-product.php.Цель здесь состояла в том, чтобы избежать использования WP_Query / get_posts (), так как они не рекомендуются для запросов продукта .

wc_get_products и WC_Product_Query предоставляют стандартный способ получения продуктов, который является безопаснымиспользовать и не сломается из-за изменений базы данных в будущих версиях WooCommerce.Создание пользовательских запросов WP_Queries или базы данных может привести к поломке кода в будущих версиях WooCommerce, поскольку данные перемещаются в сторону пользовательских таблиц для повышения производительности.Это лучший способ для разработчиков плагинов и тем извлекать несколько продуктов.wc_get_products и WC_Product_Query похожи на WordPress get_posts и WP_Query.Точно так же, как и вы, вы передаете массив аргументов, определяющих критерии поиска.

Теперь мы можем получить тот же макет / стили, что и у обычных категорий товаров / архивных страниц, но снаш запрос топ-продавцов.У нас есть название продукта, изображение, цена и кнопка «добавить в корзину», а также все стили WooCommerce / темы, примененные без необходимости создавать все с нуля, как в предыдущем методе (см. Выше).

Протестировано иработает в WooCommerce 3.5.6

defined( 'ABSPATH' ) || exit;
get_header( 'shop' );
do_action( 'woocommerce_before_main_content' );
?>
    <header class="woocommerce-products-header">
        <?php if ( apply_filters( 'woocommerce_show_page_title', true ) ) : ?>
            <h1 class="woocommerce-products-header__title page-title"><?php echo get_the_title(); ?></h1>
        <?php endif; ?>
    </header>
<?php


if ( ! function_exists( 'wc_get_products' ) ) {
    return;
}
echo '<div class="woocommerce">'; // needed for default styles 
$top_selling_products = wc_get_products( array(
    'meta_key' => 'total_sales', // our custom query meta_key
    'return'   => 'ids', // needed to pass to $post_object
    'orderby'  => array( 'meta_value_num' => 'DESC', 'title' => 'ASC' ), // order from highest to lowest of top sellers
) );
if ( $top_selling_products ) {
    do_action( 'woocommerce_before_shop_loop' );
    woocommerce_product_loop_start();
    foreach ( $top_selling_products as $top_selling_product ) {
        $post_object = get_post( $top_selling_product );
        setup_postdata( $GLOBALS['post'] =& $post_object );
        do_action( 'woocommerce_shop_loop' );
        wc_get_template_part( 'content', 'product' );
    }
    wp_reset_postdata();
    woocommerce_product_loop_end();
    do_action( 'woocommerce_after_shop_loop' );
} else {
    do_action( 'woocommerce_no_products_found' );
}
echo '</div><!-- .woocommerce -->';

do_action( 'woocommerce_after_main_content' );
do_action( 'woocommerce_sidebar' );
get_footer( 'shop' );
...