web-dev-qa-db-fra.com

WooCommerce: Affichez UNIQUEMENT les produits en vente dans la boutique

J'ai besoin de créer une page d'archive des produits} _ (généralement la page Boutique dans WooCommerce), mais affiche UNIQUEMENT les produits EN SALE. Fondamentalement, il devrait utiliser la même disposition du modèle que celle du archive-product.php. Il y aura un lien dans le menu principal qui dirigera vers cette page. Comment puis-je m'y prendre?

METTRE À JOUR

J'ai réussi à filtrer les produits EN VENTE avec le code ci-dessous placé juste au-dessus de la ligne 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 );

Le code est placé dans un copie de archive-product.php que j'ai nommé archive-product_sale.php et créé sous la forme d'un modèle de page.

Toutefois, cela ne fonctionne que pour le type Produits simples et il doit fonctionner à la fois pour les produits Simple et le type {Variable}.

9
Giraldi

J'ai réussi à filtrer les produits ON SALE avec le code ci-dessous placés juste au-dessus de la ligne 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 );

Le code est placé dans une copie de archive-product.php que j'ai renommé archive-product_sale.php et créé comme modèle page.

9
Giraldi

La réponse de @mirus concernant le shortcode m'a donné l'idée de vérifier comment WooCommerce interroge uniquement les articles en vente. Apparemment, WooCommerce a une fonction wc_get_product_ids_on_sale() qui renverra les identifiants des articles en vente. Ensuite, nous pouvons facilement ajuster la requête en utilisant le paramètre post__in pour ne renvoyer que ces éléments spécifiques.

WooCommerce a un hook woocommerce_product_query dans la classe class-wc-query.php qui nous permet de modifier la requête avant son exécution .... il est exécuté sur pre_get_posts, qui est l’endroit habituel pour modifier la requête. Utiliser le crochet de Woo signifie simplement que vous les laissez gérer la majorité de la logique conditionnelle pour savoir quand cette modification de requête doit être appliquée. 

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

}
12
helgatheviking

@gmaggio using query_posts () cassera votre site . Utilisez 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;
}

Créer une nouvelle page en utilisant le shortcode [sale_products per_page="12"]

La liste des shortcodes disponibles et de leurs paramètres est ici: http://docs.woothemes.com/document/woocommerce-shortcodes/

0
mirus