Maison  >  Questions et réponses  >  le corps du texte

WooCommerce amélioré : affichez les ventes incitatives en fonction des attributs du produit

J'ai trouvé cette excellente solution pour afficher les produits associés en fonction des attributs du produit, mais nous souhaitons également faire de même pour les ventes incitatives.

Ce que j'ai essayé jusqu'à présent ne fonctionne pas car je pense que nous devons ajouter des informations supplémentaires car la fonction Related_products n'est pas la même chose que la vente incitative.

add_filter( 'woocommerce_upsell_products', 'upsell_products_by_attribute', 10, 3 );
function upsell_products_by_attribute( $upsells, $product_id, $args ) {
    $taxonomy   = 'pa_attribute';

    $term_slugs = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'slugs'] );

    if ( empty($term_slugs) )
        return $upsells;

    $posts_ids = get_posts( array(
        'post_type'            => 'product',
        'ignore_sticky_posts'  => 1,
        'posts_per_page'       => 6,
        'post__not_in'         => array( $product_id ),
        'tax_query'            => array( array(
            'taxonomy' => $taxonomy,
            'field'    => 'slug',
            'terms'    => $term_slugs,
        ) ),
        'fields'  => 'ids',
        'orderby' => 'rand',
    ) );

    return count($posts_ids) > 0 ? $posts_ids : $upsells;
}

Je me demandais donc s'il était possible de faire la même chose avec la partie upsell.

P粉107991030P粉107991030229 Il y a quelques jours405

répondre à tous(1)je répondrai

  • P粉806834059

    P粉8068340592024-03-28 11:41:33

    Vous pouvez supprimer les crochets d'action par défaut woocommerce_after_single_product_summary 并重新添加它,您可以自定义 upsells pour les produits. Vérifiez le code ci-dessous. Le code ira dans le fichier function.php de votre thème actif.

    Modifiez $taxonomy = 'pa_color'; votre taxonomie personnalisée.

    function modify_woocommerce_upsell_display_based_on_attribute( $limit = '-1', $columns = 4, $orderby = 'rand', $order = 'desc' ){
        
        remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 );
    
        global $product;
    
        if ( ! $product ) {
            return;
        }
    
        // Handle the legacy filter which controlled posts per page etc.
        $args = apply_filters(
            'woocommerce_upsell_display_args',
            array(
                'posts_per_page' => $limit,
                'orderby'        => $orderby,
                'order'          => $order,
                'columns'        => $columns,
            )
        );
    
        wc_set_loop_prop( 'name', 'up-sells' );
        wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_upsells_columns', isset( $args['columns'] ) ? $args['columns'] : $columns ) );
    
        $orderby = apply_filters( 'woocommerce_upsells_orderby', isset( $args['orderby'] ) ? $args['orderby'] : $orderby );
        $order   = apply_filters( 'woocommerce_upsells_order', isset( $args['order'] ) ? $args['order'] : $order );
        $limit   = apply_filters( 'woocommerce_upsells_total', isset( $args['posts_per_page'] ) ? $args['posts_per_page'] : $limit );
    
        // set your custom taxonomy here.
        $taxonomy   = 'pa_color';
    
        $term_slugs = wp_get_post_terms( $product->get_id(), $taxonomy, ['fields' => 'slugs'] );
    
        $posts_ids = get_posts( array(
            'post_type'            => 'product',
            'ignore_sticky_posts'  => 1,
            'posts_per_page'       => 6,
            'post__not_in'         => array( $product->get_id() ),
            'tax_query'            => array( array(
                'taxonomy' => $taxonomy,
                'field'    => 'slug',
                'terms'    => $term_slugs,
            ) ),
            'fields'  => 'ids',
            'orderby' => 'rand',
        ) );
    
        if( !empty( $posts_ids ) ){
    
            // Get visible upsells then sort them at random, then limit result set.
            $upsells = wc_products_array_orderby( array_filter( array_map( 'wc_get_product', $posts_ids ), 'wc_products_array_filter_visible' ), $orderby, $order );
            $upsells = $limit > 0 ? array_slice( $upsells, 0, $limit ) : $upsells;
    
            wc_get_template(
                'single-product/up-sells.php',
                array(
                    'upsells'        => $upsells,
    
                    // Not used now, but used in the previous version of up-sells.php.
                    'posts_per_page' => $limit,
                    'orderby'        => $orderby,
                    'columns'        => $columns,
                )
            );
        }
    
    }
    
    add_action( 'woocommerce_after_single_product_summary', 'modify_woocommerce_upsell_display_based_on_attribute', 15 );

    répondre
    0
  • Annulerrépondre