템플릿 페이지에서 woocommerce의 사용자 정의 루프를 통해 주요 제품 표시


19

내 woocommerce 상점의 6 가지 추천 제품을 home-page.php 템플릿에 표시하고 싶습니다. 일부 연구를 한 후 올바른 루프 방법은 사용자 정의 루프를 통해 이루어 졌다는 것을 알았습니다 (스타일링 등을 위해 클래스를 추가하고 싶기 때문에 단축 코드를 사용하고 싶지 않습니다). 추천 상품은 '_featured'입니다. 아래 코드를 정리하여 내 매장에서 추천 제품으로 선택한 제품을 표시했지만 작동하지 않습니다 ... 도움이 필요합니다.

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

이 답변에 설명 된 사용자 정의 var_dump( get_meta_values( '_featured', 'product' );함수 get_meta_values가 함수 를 지원하는 위치 의 결과를 추가하십시오.
Pieter Goosen

답변:


17

인수를 다음과 같이 변경하십시오.

$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 / includes / class-wc-shortcodes.php (@ 595)로 이동하면 WC 단축 코드에 대한 수행 방법을 찾을 수 있습니다.


3
'_featured'는 숫자 값으로 저장되지 않습니다. 문자열 'yes'또는 'no'로 저장됩니다. OP 질문의 다른 모든 것이 효과가 있고 나를 위해 일했습니다.
i_a

1
WooCommerce 3.0부터이 솔루션은 더 이상 작동하지 않습니다. 아래의 업데이트 된 답변을 참조하십시오.
dpruth

22

WooCommerce 3.0에서 변경되었습니다. 단순히 meta_query가 아니라 이제 tax_query를 포함합니다. 인수는 다음과 같습니다.

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

woocommerce / includes / class-wc-shortcodes.php 참조


1
내가 찾던 것!
joshkrz

또한 Woocommerce 3.0의 경우을 wc_placeholder_img_src대신 사용 하는 것이 좋습니다 woocommerce_placeholder_img_src.
Robotnicka

6

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

WooCommerce Wiki 에 따르면 :

제품을 검색하기 위해 사용자 정의 WP_Queries 또는 데이터베이스 쿼리를 빌드 하면 데이터가 더 나은 성능을 위해 사용자 정의 테이블로 이동함에 따라 향후 WooCommerce 버전에서 코드가 손상 될 수 있습니다 .

WooCommerce 사용하여 옹호 wc_get_products()또는 WC_Product_Query()대신 WP_Query()또는 get_posts().

https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/에서 원하는 것을 달성하는 데 사용한 코드로 게시물을 작성했습니다.


죄송합니다. 작성된 코드를 보지 않으면 기사를 이해하기 어렵습니다. 코딩을 포함시켜 주시겠습니까?
HOY

@HOY 내장 플러그인이 고장났습니다. 이제 수정되었으며 코드를 볼 수 있습니다!
cfx

고맙습니다. 솔루션을 찾는 동안 아래 에서이 문제를 생각해 냈습니다. 나는 당신을 완전히 점검 할 수 없었기 때문에 그것이 당신과 어떻게 다른지 확신하지 못하지만 매우 짧고 맞춤형 제품 루프로 나를 도왔습니다. kathyisawesome.com/woocommerce-modifying-product-query
HOY

1

나는 이것이 매우 오래되었다는 것을 알고 있지만 여기서 대안 솔루션을 공유 했으며이 주제에 도달하는 사람들에게도 도움이 될 수 있다고 생각합니다.

대신에 사용하는 meta_query또는 tax_query, 당신은 사용할 수 있습니다 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 );

도움이 되길 바랍니다!


1

기준 : https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query

나는 시도 할 것이다 :

외부 루프 :

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

 );

 $products = wc_get_products( $args );

루프에서 :

$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

당신이 데이터베이스에 살펴 경우 wp_postmeta테이블 당신은 볼 수 meta_key있을 것입니다 _featuredmeta_value있을 것 yes또는 no그렇게하는 대신 값 0또는 1쓰기 yes또는no

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

제발 편집 답변을 하고, 설명을 추가 : 문제를 해결할 수있는?
fuxia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.