Hiển thị các sản phẩm nổi bật thông qua vòng lặp tùy chỉnh trong thương mại điện tử trên trang mẫu


19

Tôi muốn hiển thị 6 sản phẩm nổi bật từ cửa hàng thương mại điện tử của tôi trên mẫu home-page.php của tôi. Sau một số nghiên cứu tôi thấy rằng cách đúng đắn để thực hiện điều này là thông qua một vòng lặp tùy chỉnh, (tôi không muốn sử dụng mã ngắn vì tôi muốn thêm các lớp bổ sung để tạo kiểu, v.v.) Tôi cũng thấy rằng khóa mà thương mại điện tử sử dụng cho sản phẩm đặc trưng là '_featured'. Tôi kết hợp mã dưới đây để hiển thị bất kỳ sản phẩm nào tôi chọn là sản phẩm nổi bật trong cửa hàng của mình, nhưng nó không hoạt động ... Bất kỳ trợ giúp nào đều được đánh giá cao.

<?php

    $args = array(
        'post_type'   => 'product',
        'stock'       => 1,
        'showposts'   => 6,
        'orderby'     => 'date',
        'order'       => 'DESC' ,
        'meta_query'  => array(
            array(
                'key'     => '_featured',
                'value'   => 0,
                'compare' => '>',
                'type'    => 'numeric'
            )
        )
    );

    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post(); global $product; ?>

        <li>    
            <?php 
                if ( has_post_thumbnail( $loop->post->ID ) ) 
                    echo get_the_post_thumbnail( $loop->post->ID, 'shop_catalog' ); 
                else 
                    echo '<img src="' . woocommerce_placeholder_img_src() . '" alt="Placeholder" width="65px" height="115px" />'; 
            ?>
            <h3><?php the_title(); ?></h3>

            <?php 
                echo $product->get_price_html(); 
                woocommerce_template_loop_add_to_cart( $loop->post, $product );
            ?>    
        </li>

<?php 
    endwhile;
    wp_reset_query(); 
?>

Thêm kết quả từ var_dump( get_meta_values( '_featured', 'product' );nơi chức năng get_meta_valuesđược hỗ trợ bởi chức năng tùy chỉnh được giải thích trong câu trả lời này
Pieter Goosen

Câu trả lời:


17

Thay đổi đối số của bạn để được như thế này:

$meta_query   = WC()->query->get_meta_query();
$meta_query[] = array(
    'key'   => '_featured',
    'value' => 'yes'
);
$args = array(
    'post_type'   =>  'product',
    'stock'       =>  1,
    'showposts'   =>  6,
    'orderby'     =>  'date',
    'order'       =>  'DESC',
    'meta_query'  =>  $meta_query
);

Nếu bạn truy cập wp-content / plugin / wooc Commerce / gồm / class-wc-shortcodes.php (@ 595), bạn có thể tìm thấy cách thực hiện đối với mã ngắn WC.


3
Chìa khóa cần lưu ý là '_featured' không được lưu dưới dạng giá trị số. Nó được lưu trữ dưới dạng một chuỗi 'có' hoặc 'không'. Mọi thứ khác trong câu hỏi OP nên hoạt động, làm việc cho tôi.
i_a

1
Kể từ WooC Commerce 3.0, giải pháp này không còn hoạt động. Xin vui lòng xem câu trả lời cập nhật của tôi dưới đây.
dpruth

22

Điều này đã thay đổi trong WooC Commerce 3.0. Nó không chỉ đơn giản là meta_query, mà giờ còn bao gồm tax_query. Các đối số là:

    $meta_query  = WC()->query->get_meta_query();
    $tax_query   = WC()->query->get_tax_query();
    $tax_query[] = array(
        'taxonomy' => 'product_visibility',
        'field'    => 'name',
        'terms'    => 'featured',
        'operator' => 'IN',
    );

    $args = array(
        'post_type'           => 'product',
        'post_status'         => 'publish',
        'ignore_sticky_posts' => 1,
        'posts_per_page'      => $atts['per_page'],
        'orderby'             => $atts['orderby'],
        'order'               => $atts['order'],
        'meta_query'          => $meta_query,
        'tax_query'           => $tax_query,
    );

Xem thương mại điện tử / bao gồm / class-wc-shortcodes.php


1
Chỉ cần những gì tôi đang tìm kiếm!
joshkrz

Ngoài ra đối với Wooc Commerce 3.0, họ khuyên bạn nên sử dụng wc_placeholder_img_srcthay vì woocommerce_placeholder_img_src.
Robotnicka

6

Vòng lặp sản phẩm nổi bật trong WooC Commerce 3

<ul class="products">
<?php
$args = array(
    'post_type' => 'product',
    'posts_per_page' => 12,
    'tax_query' => array(
            array(
                'taxonomy' => 'product_visibility',
                'field'    => 'name',
                'terms'    => 'featured',
            ),
        ),
    );
$loop = new WP_Query( $args );
if ( $loop->have_posts() ) {
    while ( $loop->have_posts() ) : $loop->the_post();
        wc_get_template_part( 'content', 'product' );
    endwhile;
} else {
    echo __( 'No products found' );
}
wp_reset_postdata();
?>

5

Theo Wiki WooC Commerce :

Xây dựng WP_Queries hoặc truy vấn cơ sở dữ liệu tùy chỉnh [để truy xuất sản phẩm] có khả năng phá vỡ mã của bạn trong các phiên bản tương lai của WooC Commerce khi dữ liệu di chuyển về các bảng tùy chỉnh để có hiệu suất tốt hơn.

WooC Commerce ủng hộ việc sử dụng wc_get_products()hoặc WC_Product_Query()thay vì WP_Query()hoặc get_posts().

Tôi đã viết một bài đăng với mã tôi đã sử dụng để đạt được những gì bạn muốn ở đây: https://cfxdesign.com/create-a-custom-wooc Commerce-products-boot- the- right-way /


xin lỗi, không nhìn thấy một số mã bằng văn bản, thật khó để hiểu bài viết của bạn. Bạn có thể vui lòng bao gồm một số mã hóa?
HOY

@HOY plugin nhúng đã bị hỏng; Bây giờ nó đã được sửa và bạn có thể xem mã!
cfx

cảm ơn bạn, trong khi tìm kiếm giải pháp, tôi đã đưa ra cái này dưới đây. Tôi không chắc nó khác với bạn như thế nào vì tôi không thể kiểm tra của bạn một cách xuyên suốt nhưng nó rất ngắn và giúp tôi với một vòng lặp sản phẩm tùy chỉnh. kathyisawgie.com/woocommerce-modifying-product-query
HOY

1

Tôi biết điều này khá cũ, nhưng tôi vừa chia sẻ một giải pháp thay thế ở đây và tôi nghĩ nó cũng có thể giúp những người tiếp cận chủ đề này.

Thay vì sử dụng meta_queryhoặc tax_query, bạn cũng có thể sử dụng wc_get_featured_product_ids () :

$args = array(
    'post_type'           => 'product',
    'posts_per_page'      => 6,
    'orderby'             => 'date',
    'order'               => 'DESC',
    'post__in'            => wc_get_featured_product_ids(),
);

$query = new WP_Query( $args );

Tôi hy vọng nó sẽ giúp!


1

Dựa trên: https://github.com/wooc Commerce / wooc Commerce / wiki / wc_get_products-and-WC_ SẢNt_Query

Tôi sẽ thử:

vòng lặp bên ngoài:

$args = array (
'limit' => 6,
'orderby' => 'title',
'order' => 'ASC',
'category' => $club_cat,
'stock_status' => 'instock',
'featured' => true,

 );

 $products = wc_get_products( $args );

trong vòng:

$query = new WC_Product_Query( array(
'limit' => 6,
'orderby' => 'title',
'order' => 'ASC',
'category' => $club_cat,
'stock_status' => 'instock',
'featured' => true,
'return' => 'ids',

 ) );

 $products = $query->get_products();

0

nếu bạn có một cái nhìn trong cơ sở dữ liệu trong wp_postmetabảng, bạn sẽ thấy meta_keysẽ _featuredmeta_valuesẽ yeshoặc nonên thay vì giá trị 0hoặc 1ghi yeshoặcno

<?php
    $q = new WP_Query([
      'post_type'   =>  'product',
      'stock'       =>  1,
      'showposts'   =>  3,
      'orderby'     =>  'date',
      'order'       =>  'DESC',
      'meta_query'  =>  [ 
        ['key' => '_featured', 'value' => 'yes' ]
        ]
    ]);
    if ( $q->have_posts() ) :
        while ( $q->have_posts() ) : $q->the_post();
            // display product info
        endwhile; wp_reset_query();
    endif;
?>

0
<ul class="products">
    <?php
        $args = array(
            'post_type' => 'product',
            'posts_per_page' => 12,
            'tax_query' => array(
                    array(
                        'taxonomy' => 'product_visibility',
                        'field'    => 'name',
                        'terms'    => 'featured',
                    ),
                ),
            );
        $loop = new WP_Query( $args );
        if ( $loop->have_posts() ) {
            while ( $loop->have_posts() ) : $loop->the_post();
               echo '<p>'.get_the_title().'</p>';
            endwhile;
        } else {
            echo __( 'No products found' );
        }
        wp_reset_postdata();
    ?>
</ul><!--/.products-->

Vui lòng chỉnh sửa câu trả lời của bạn và thêm một lời giải thích: tại sao điều đó có thể giải quyết vấn đề?
fuxia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.