Tampilkan produk unggulan melalui loop kustom di woocommerce pada halaman template


19

Saya ingin menampilkan 6 produk unggulan dari toko woocommerce saya di templat home-page.php saya. Setelah beberapa penelitian saya menemukan bahwa cara yang tepat untuk melakukan ini adalah melalui loop kustom, (Saya tidak ingin menggunakan shortcode karena saya ingin menambahkan kelas tambahan untuk styling dll.) Saya juga menemukan bahwa kunci yang digunakan woocommerce untuk produk unggulan adalah '_featured'. Saya mengumpulkan kode di bawah ini untuk menampilkan produk apa pun yang saya pilih untuk menjadi produk unggulan di toko saya, tetapi tidak berfungsi ... Bantuan apa pun dihargai.

<?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(); 
?>

Tambahkan hasil dari var_dump( get_meta_values( '_featured', 'product' );mana fungsi get_meta_valuesdidukung oleh fungsi kustom yang dijelaskan dalam jawaban ini
Pieter Goosen

Jawaban:


17

Ubah args Anda menjadi seperti ini:

$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
);

Jika Anda pergi ke wp-content / plugins / woocommerce / include / class-wc-shortcodes.php (@ 595) Anda dapat menemukan cara melakukannya untuk shortcode WC.


3
Kunci yang perlu diperhatikan adalah bahwa '_featured' tidak disimpan sebagai nilai numerik. Ini disimpan sebagai string 'ya' atau 'tidak'. Segala sesuatu yang lain dalam pertanyaan OP harus bekerja, bekerja untuk saya.
i_a

1
Pada WooCommerce 3.0, solusi ini tidak lagi berfungsi. Silakan lihat jawaban saya yang diperbarui di bawah ini.
dpruth

22

Ini telah berubah di WooCommerce 3.0. Ini bukan hanya meta_query, tetapi sekarang termasuk tax_query. Argumennya sekarang:

    $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,
    );

Lihat woocommerce / include / class-wc-shortcodes.php


1
Apa yang saya cari!
joshkrz

Juga untuk Woocommerce 3.0, mereka merekomendasikan menggunakan wc_placeholder_img_srcbukan woocommerce_placeholder_img_src.
Robotnicka

6

Produk Unggulan Loop di WooCommerce 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

Menurut WooCommerce Wiki :

Membuat WP_Queries atau kueri basis data khusus [untuk mengambil produk] cenderung memecah kode Anda di versi WooCommerce di masa mendatang saat data bergerak menuju tabel khusus untuk kinerja yang lebih baik.

Pendukung WooCommerce menggunakan wc_get_products()atau WC_Product_Query()bukannya WP_Query()atau get_posts().

Saya telah menulis posting dengan kode yang saya gunakan untuk mencapai apa yang Anda inginkan di sini: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/


maaf, tanpa melihat beberapa kode tertulis, sulit untuk memahami artikel Anda. Bisakah Anda memasukkan beberapa kode?
HOY

@HOY plugin embed telah rusak; sudah diperbaiki sekarang dan Anda dapat melihat kode!
cfx

terima kasih, sambil mencari solusi, saya datang dengan yang di bawah ini. Saya tidak yakin bagaimana perbedaannya dari milik Anda karena saya tidak dapat memeriksa Anda sepenuhnya tetapi sangat pendek dan membantu saya dengan lingkaran produk kustom. kathyisawesome.com/woocommerce-modifying-product-query
HOY

1

Saya tahu ini cukup lama, tetapi saya baru saja berbagi solusi alternatif di sini dan saya pikir ini dapat membantu mereka yang mencapai topik ini juga.

Alih-alih menggunakan meta_queryatau tax_query, Anda dapat menggunakan wc_get_featured_product_ids () juga:

$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 );

Saya harap ini membantu!


1

Didasarkan pada: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

Aku akan mencoba:

lingkaran luar:

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

 );

 $products = wc_get_products( $args );

dalam lingkaran:

$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

jika anda melihat dalam database di wp_postmetameja Anda akan melihat meta_keyakan _featureddan meta_valueakan yesatau nojadi bukan nilai 0atau 1menulis yesatauno

<?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-->

Harap edit jawaban Anda , dan tambahkan penjelasan: mengapa itu bisa menyelesaikan masalah?
fuxia
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.