web-dev-qa-db-fra.com

Remplacez la gamme de prix variables par le prix de variation choisi dans WooCommerce 3

Sur WooCommerce, je souhaite modifier la présentation de page Variable pour un seul produit. Parce que, lorsque vous avez un produit variable, vous obtenez cette rage de prix câblée (sous le titre du produit) sur la page Produit variable et elle apparaît également sur la page de la boutique. 

Pour moi, la méthode standard consiste à afficher le prix le plus bas du produit dans la boutique ainsi que la page du produit et à modifier ce prix en fonction des variables sélectionnées par l'utilisateur. Je ne peux pas croire pourquoi.

Je peux supprimer la fourchette de prix et afficher le prix le plus bas à l'aide de cet extrait de code.

https://businessbloomer.com/disable-variable-product-price-range-woocommerce/

Mais là encore, le prix le plus bas ne change pas en fonction des variables sélectionnées. Il y a encore deux prix dans la disposition du produit variable. Ceci est ma mise en page de produit variable actuelle 

http://www.preorders.lk/product/beats-solo3-wireless-on-ear-headphones/

Alors, est-ce que quelqu'un peut, s'il vous plaît, aider à supprimer la gamme de prix de la page de produit variable et ne montrer qu'un prix le plus bas (sous le titre du produit) du produit par défaut. Ce prix devrait donc être modifié en fonction des variables dont dispose ce produit. Et ce prix le plus bas devrait également figurer sur la page de la boutique. 

J'espère que c'est clair. S'il vous plaît laissez-moi savoir si quelque chose n'est pas clair. Veuillez vous référer à l'image ci-jointe pour plus de détails.

Merci.

 Screenshot

8

Nouvelle mise à jour améliorée dans le fil suivant (June 2018):

Remplacer la variation par défaut du traitement de la fourchette de prix affiché dans Woocommerce 3


Mise à jour (décembre 2017): à éviter, problèmes concernant les produits non variables dans certains thèmes et un bogue de disponibilité de répétition dans certains thèmes.

Note: Certains plugins comme le marché allemand ou certains thèmes ne fonctionneront pas avec ce code, car ils apportent leurs propres modifications dans les crochets ou dans la structure html.

C'est tout à fait possible.

  1. Nous supprimons d’abord le prix indésirable.
  2. Nous produisons à la place le prix variable sans la fourchette de prix et affichons le prix le plus bas.
  3. Nous faisons une copie de ce prix variable dans un conteneur caché (à utiliser/à lire par notre script jQuery)
  4. Ensuite, nous masquons les conteneurs du prix de variation choisi (et la disponibilité des stocks) 
  5. À l'aide de notre script jQuery, lorsque nous obtenons le prix de variation choisi, nous remplaçons le prix variable (et affichons la disponibilité des stocks). 
  6. Si le client change de variation, nous mettons à jour le prix ... Si le prix de variation n'est pas affiché pendant ce processus de changement, notre prix variable est affiché

Voici ce code:

add_action( 'woocommerce_before_single_product', 'move_variations_single_price', 1 );
function move_variations_single_price(){
    global $product, $post;

    if ( $product->is_type( 'variable' ) ) {
        // removing the variations price for variable products
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );

        // Change location and inserting back the variations price
        add_action( 'woocommerce_single_product_summary', 'replace_variation_single_price', 10 );
    }
}

function replace_variation_single_price(){
    global $product;

    // Main Price
    $prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
    $price = $prices[0] !== $prices[1] ? sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );

    // Sale Price
    $prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) );
    sort( $prices );
    $saleprice = $prices[0] !== $prices[1] ? sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );

    if ( $price !== $saleprice && $product->is_on_sale() ) {
        $price = '<del>' . $saleprice . $product->get_price_suffix() . '</del> <ins>' . $price . $product->get_price_suffix() . '</ins>';
    }

    ?>
    <style>
        div.woocommerce-variation-price,
        div.woocommerce-variation-availability,
        div.hidden-variable-price {
            height: 0px !important;
            overflow:hidden;
            position:relative;
            line-height: 0px !important;
            font-size: 0% !important;
        }
    </style>
    <script>
    jQuery(document).ready(function($) {
        $('select').blur( function(){
            if( '' != $('input.variation_id').val() ){
                if($('p.availability'))
                    $('p.availability').remove();
                $('p.price').html($('div.woocommerce-variation-price > span.price').html()).append('<p class="availability">'+$('div.woocommerce-variation-availability').html()+'</p>');
                console.log($('input.variation_id').val());
            } else {
                $('p.price').html($('div.hidden-variable-price').html());
                if($('p.availability'))
                    $('p.availability').remove();
                console.log('NULL');
            }
        });
    });
    </script>
    <?php

    echo '<p class="price">'.$price.'</p>
    <div class="hidden-variable-price" >'.$price.'</div>';
}

Le code va dans n'importe quel fichier php de votre thème enfant actif (ou thème) ou aussi dans n'importe quel fichier plugin php.

Ce code est testé et fonctionne sur WooCommerce 3.2.x (devrait également fonctionner sur WooCommerce 2.6.x))}

Vous pouvez éventuellement déplacer le CSS (<style></style>) dans le fichier styles.css de votre thème enfant actif (ou thème actif), puis le supprimer de cette fonction…


En relation:

12
LoicTheAztec

Je suis conscient que je ressuscite un ancien fil ici, mais quelque chose que j'ai découvert en utilisant ce code est que vous devez savoir qu'avec ce code, vous risquez d'empêcher des prix uniques et non variables de s'afficher sur certains thèmes comme:

remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );

est déclenchée sur toutes les pages de produits, qu’il s’agisse d’un produit variable ou non.

Vous pouvez utiliser la version ci-dessous qui vérifie simplement si le produit actuel est variable ou non avant d'exécuter le reste du code.

    add_action( 'woocommerce_before_single_product', 'check_if_variable_first' );
function check_if_variable_first(){
    if ( is_product() ) {
        global $post;
        $product = wc_get_product( $post->ID );
        if ( $product->is_type( 'variable' ) ) {
            // removing the price of variable products
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );

// Change location of
add_action( 'woocommerce_single_product_summary', 'custom_wc_template_single_price', 10 );
function custom_wc_template_single_price(){
    global $product;

// Variable product only
if($product->is_type('variable')):

    // Main Price
    $prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
    $price = $prices[0] !== $prices[1] ? sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );

    // Sale Price
    $prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) );
    sort( $prices );
    $saleprice = $prices[0] !== $prices[1] ? sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );

    if ( $price !== $saleprice && $product->is_on_sale() ) {
        $price = '<del>' . $saleprice . $product->get_price_suffix() . '</del> <ins>' . $price . $product->get_price_suffix() . '</ins>';
    }

    ?>
    <style>
        div.woocommerce-variation-price,
        div.woocommerce-variation-availability,
        div.hidden-variable-price {
            height: 0px !important;
            overflow:hidden;
            position:relative;
            line-height: 0px !important;
            font-size: 0% !important;
        }
    </style>
    <script>
    jQuery(document).ready(function($) {
        $('select').blur( function(){
            if( '' != $('input.variation_id').val() ){
                $('p.price').html($('div.woocommerce-variation-price > span.price').html()).append('<p class="availability">'+$('div.woocommerce-variation-availability').html()+'</p>');
                console.log($('input.variation_id').val());
            } else {
                $('p.price').html($('div.hidden-variable-price').html());
                if($('p.availability'))
                    $('p.availability').remove();
                console.log('NULL');
            }
        });
    });
    </script>
    <?php

    echo '<p class="price">'.$price.'</p>
    <div class="hidden-variable-price" >'.$price.'</div>';

endif;
}

        }
    }
}
1
Andrew Sumner