webentwicklung-frage-antwort-db.com.de

WooCommerce: NUR Verkaufsprodukte im Shop anzeigen

Ich muss eine products Archivseite erstellen (normalerweise die Shop Seite in WooCommerce ), aber NUR die ON SALE products anzeigen. Grundsätzlich sollte das gleiche Vorlagenlayout wie im archive-product.php verwendet werden. Es gibt einen Link im Hauptmenü, der auf diese Seite verweist. Wie gehe ich vor?

AKTUALISIEREN

Ich habe es geschafft, die ON SALE Produkte herauszufiltern, wobei der Code unterhalb der if ( have_posts() ) :-Zeile steht ...

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

query_posts( $args );

Der Code befindet sich in einer copy von archive-product.php, die ich archive-product_sale.php nannte und als page template erstellt wurde.

Dies funktioniert jedoch nur für Simple products type und ich brauche es, um sowohl für Simple products als auch Variable product type zu funktionieren.

9
Giraldi

Ich habe es geschafft, die ON SALE -Produkte mit dem unten stehenden Code direkt über der if ( have_posts() ) :-Zeile herauszufiltern ...

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

Der Code befindet sich in einer Kopie von archive-product.php, die ich in archive-product_sale.php umbenannt und als page template erstellt habe.

9
Giraldi

Die Antwort von @mirus bezüglich des Shortcodes brachte mich auf die Idee, herauszufinden, wie WooCommerce nur die angebotenen Artikel abfragt. Anscheinend hat WooCommerce eine wc_get_product_ids_on_sale()-Funktion, die die IDs der verkauften Artikel zurückgibt. Dann können Sie die Abfrage einfach mit dem post__in-Parameter anpassen, um nur diese spezifischen Elemente zurückzugeben.

WooCommerce verfügt über einen woocommerce_product_query-Hook in der class-wc-query.php-Klasse, der es uns ermöglicht, die Abfrage zu ändern, bevor sie ausgeführt wird. Sie wird auf pre_get_posts ausgeführt, dem üblichen Ort zum Ändern der Abfrage. Wenn Sie den Haken von Woo verwenden, bedeutet das nur, dass Sie den Großteil der bedingten Logik darüber, wann diese Abfrageänderung angewendet werden soll, handhaben lassen. 

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 Verwendung von query_posts () zerstört Ihre Website . Verwenden Sie 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;
}

Lösung für variable und einfache Produkte:

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

Erstellen Sie eine neue Seite mit dem Kurzcode [sale_products per_page="12"]

Eine Liste der verfügbaren Kurzwahlen und ihrer Parameter finden Sie hier: http://docs.woothemes.com/document/woocommerce-shortcodes/

0
mirus