Özellikli ürünleri şablon sayfasında woocommerce olarak özel döngü aracılığıyla görüntüleme


19

Woocommerce mağazamdan 6 özellikli ürünü ana sayfam.php şablonumda görüntülemek istiyorum. Bazı araştırmalardan sonra bunu yapmanın doğru yolunun özel bir döngüden geçtiğini gördüm, (kısa kodlar kullanmak istemiyorum çünkü stil için ek sınıflar eklemek istiyorum vb.) Ayrıca woocommerce'nin kullandığı anahtarın öne çıkan ürünler '_featured'. Mağazamda öne çıkmayı seçtiğim ürünleri görüntülemek için aşağıdaki kodu bir araya getirdim, ancak çalışmıyor ... Herhangi bir yardım için teşekkür ederiz.

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

Bu yanıtta açıklanan özel işlev tarafından var_dump( get_meta_values( '_featured', 'product' );işlevin get_meta_valuesdesteklendiği yerden sonuçları ekleyin
Pieter Goosen

Yanıtlar:


17

Arglerinizi şu şekilde değiştirin:

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

Wp-content / plugins / woocommerce / include / class-wc-shortcodes.php (@ 595) adresine giderseniz, bunun WC kısa kodları için nasıl yapıldığını bulabilirsiniz.


3
Dikkat edilmesi gereken nokta, '_featured' değerinin sayısal bir değer olarak kaydedilmemesidir. 'Evet' veya 'hayır' dizesi olarak saklanır. OP sorusundaki diğer her şey çalışmalı, benim için çalıştı.
i_a

1
WooCommerce 3.0'dan itibaren bu çözüm artık çalışmıyor. Lütfen aşağıdaki güncellenmiş cevabıma bakın.
dpruth

22

Bu WooCommerce 3.0'da değişti. Bu sadece bir meta_query değil, artık bir tax_query içeriyor. Argümanlar şimdi:

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

Bkz. Woocommerce / include / class-wc-shortcodes.php


1
Tam da aradığım şey!
joshkrz

Ayrıca Woocommerce 3.0 için wc_placeholder_img_srcbunun yerine kullanılmasını öneriyorlar woocommerce_placeholder_img_src.
Robotnicka

6

Özellikli Ürünler in 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

Göre WooCommerce Wiki :

[Ürünleri almak için] özel WP_Queries veya veritabanı sorguları oluşturmanın, daha iyi performans için veriler özel tablolara doğru ilerledikçe WooCommerce'ın gelecekteki sürümlerinde kodunuzu kırması muhtemeldir .

WooCommerce, wc_get_products()veya WC_Product_Query()yerine WP_Query()veya kullanarak savunuculuk yapar get_posts().

Burada istediğini elde etmek için kullandığım kod ile bir yazı yazdım: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/


üzgünüm, bazı yazılı kodları görmeden, makalenizi anlamak zor. Lütfen biraz kodlama ekleyebilir misiniz?
HOY

@ Gömme eklentisi kırıldı; Şimdi düzeltildi ve kodu görebilirsiniz!
cfx

teşekkür ederim, çözüm ararken, ben bunu aşağıda buldum. Seninkini nasıl kontrol edemediğimden seninkinden nasıl farklı olduğundan emin değilim ama çok kısa ve özel bir ürün döngüsünde bana yardımcı oldu. kathyisawesome.com/woocommerce-modifying-product-query
HOY

1

Bunun oldukça eski olduğunu biliyorum, ama burada sadece alternatif bir çözüm paylaştım ve bence bu konuya ulaşanlara da yardımcı olabilir.

Bunun yerine kullanmanın meta_queryya tax_querykullanabileceğiniz wc_get_featured_product_ids () çok:

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

Umut ediyorum bu yardım eder!


1

Dayalı: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

Ben denemek istiyorum:

dış döngü:

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

 );

 $products = wc_get_products( $args );

döngünün içinde:

$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

İçinde veritabanındaki bir göz atın eğer wp_postmetamasanın göreceksiniz meta_keyolacak _featuredve meta_valueolacak yesya noöylesine value yerine 0veya 1yazma yesveyano

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

Lütfen yanıtınızı düzenleyin ve bir açıklama ekleyin: bu sorunu neden çözebilir?
fuxia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.