web-dev-qa-db-ja.com

WooCommerce:ショップで販売中の製品のみを表示

製品アーカイブページ(通常ショップWooCommerceのページ)を作成する必要がありますが、セール製品。基本的には、_archive-product.php_と同じテンプレートレイアウトを使用する必要があります。このページへのリンクがメインメニューに表示されます。これについてどうすればよいですか?

更新

私はなんとかON SALE製品を除外し、以下のコードをif ( have_posts() ) :行のすぐ上に配置しました...

_$args = array(
    'post_type'      => 'product',
    'order'          => 'ASC',
    'paged'          => $paged,
    'meta_query'     => array(
        array(
            'key'           => '_sale_price',
            'value'         => 0,
            'compare'       => '>',
            'type'          => 'numeric'
        )
    )
);

query_posts( $args );
_

コードは、私が_archive-product.php_と名付けてページテンプレートとして作成した_archive-product_sale.php_のcopyに配置されています。

ただし、これはSimple productsタイプでのみ機能し、Simple製品とVariable製品タイプの両方で機能する必要があります。

10
Giraldi

ショートコードに関する@mirusの回答から、WooCommerceが販売中のアイテムのみをクエリしている方法を確認することができました。どうやらWooCommerceには、販売中のアイテムのIDを返すwc_get_product_ids_on_sale()関数があります。次に、post__inパラメータを使用してクエリを簡単に調整し、特定のアイテムのみを返すことができます。

WooCommerceはwoocommerce_product_queryクラスにclass-wc-query.phpフックがあり、実行前にクエリを変更できます。..を変更する通常の場所であるpre_get_postsで実行されます。クエリ。 Wooのフックを使用するということは、このクエリの変更をいつ適用するかについての条件付きロジックの大部分を処理させることを意味します。

add_action( 'woocommerce_product_query', 'so_20990199_product_query' );

function so_20990199_product_query( $q ){

    $product_ids_on_sale = wc_get_product_ids_on_sale();

    $q->set( 'post__in', $product_ids_on_sale );

}
14
helgatheviking

私はなんとかON SALE以下のコードで製品を除外しましたすぐ上に配置if ( have_posts() ) :行...

$args = array(
    'post_type'      => 'product',
    'meta_query'     => array(
        'relation' => 'OR',
        array( // Simple products type
            'key'           => '_sale_price',
            'value'         => 0,
            'compare'       => '>',
            'type'          => 'numeric'
        ),
        array( // Variable products type
            'key'           => '_min_variation_sale_price',
            'value'         => 0,
            'compare'       => '>',
            'type'          => 'numeric'
        )
    )
);

query_posts( $args );

コードはarchive-product.phpのコピーに配置され、archive-product_sale.phpに名前を変更してページテンプレートとして作成しました。

9
Giraldi

@ gmaggio query_posts()を使用 サイトが壊れますpre_get_posts を使用します

add_filter( 'pre_get_posts', 'catalog_filters' );
function catalog_filters( $query ) {
    if ( $query->is_main_query() && $query->post_type = 'product' ) {
        if(isset($_GET['onsale'])) {
            $meta_query = array(
                'relation' => 'OR',
                array( // Simple products type
                'key' => '_sale_price',
                'value' => 0,
                'compare' => '>',
                'type' => 'numeric'
                ),
                array( // Variable products type
                'key' => '_min_variation_sale_price',
                'value' => 0,
                'compare' => '>',
                'type' => 'numeric'
                )
            ); $query->set('meta_query', $meta_query); d($query);
        }
        if(isset($_GET['bestsellers'])) {
            $meta_query     = array(
            array( 
                'key'           => 'total_sales',
                'value'         => 0,
                'compare'       => '>',
                'type'          => 'numeric'
                )
            );
        }
    }

return $query;
}

可変でシンプルな製品のソリューション:

add_action( 'save_post_product', 'update_product_set_sale_cat_var' );

function update_product_set_sale_cat_var( $post_id ) {

    $sales_ids = wc_get_product_ids_on_sale();

    foreach ( $sales_ids as $sale_id ) :
        if ($sale_id == $post_id) :
            wp_set_object_terms($post_id, 'sale', 'product_cat', true );
        else :
            if ( has_term( 'sale', 'product_cat', $post_id ) ) {
                wp_remove_object_terms( $post_id, 'sale', 'product_cat' );
            }
        endif;
    endforeach; 

}
0
simple-user

ショートコード[sale_products per_page="12"]を使用して新しいページを作成します

利用可能なショートコードとそのパラメータのリストはこちらです http://docs.woothemes.com/document/woocommerce-shortcodes/

0
mirus