web-dev-qa-db-ja.com

WooCommerce 3で選択した変動価格で変動価格範囲を置き換えます

WooCommerceでは、Variable single product page layoutを変更したいと思います。なぜなら、可変製品がある場合は、可変製品ページでこの有線価格の範囲(製品タイトルの下)を取得し、ショップページにも表示されるからです。

私にとって標準的な方法は、ショップと製品ページで製品の最低価格を表示し、変数のユーザー選択に従ってその価格を変更することです。信じられない。

このコードスニペットを使用して、価格帯を削除し、最低価格を表示できます。

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

しかし、再び、その最低価格は選択した変数に応じて変化しません。可変製品レイアウトには再び2つの価格があります。これは現在の可変製品ページのレイアウトです

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

だから、誰でも可変製品ページから価格帯を削除し、デフォルトとして製品の最低価格を1つだけ(製品タイトルの下に)表示するのを手伝ってください。そのため、その製品が持つ変数に応じて価格を変更する必要があります。また、その最低価格もショップページに表示する必要があります。

これが明確であることを願っています。不明な点がある場合はお知らせください。詳細については、添付の画像を参照してください。

ありがとう。

Screenshot

10

次のスレッドの新しい改善された更新(2018年6月)

Woocommerce 3で表示されるデフォルトの変動価格を処理する価格範囲を置き換える


(2017年12月)を更新して、一部のテーマおよび繰り返しでの非可変製品に関する問題いくつかのテーマの可用性バグ

注:ドイツ市場のようなプラグインやテーマは機能しませんこのコードでは、フックまたはhtml構造に独自の変更を加えるためです。

これは完全に可能です。

  1. まず、不要な価格を削除します。
  2. 代わりに、価格帯なしで変動価格を出力し、最低価格を表示します。
  3. この可変価格のコピーを隠しコンテナーに作成します(jQueryスクリプトで使用/読み取り用)
  4. 次に、選択した変動価格のコンテナ(および在庫の可用性)を非表示にします
  5. jQueryスクリプトを使用して、選択した変動価格を取得したら、可変価格を置き換えます(そして在庫状況を表示します) )。
  6. 顧客が変動を変更した場合、価格を更新します...変動価格がその変更プロセス中に表示されない場合、変動価格が表示されます

そのコードは次のとおりです。

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>';
}

コードは、アクティブな子テーマ(またはテーマ)のphpファイル、またはプラグインphpファイルにも含まれます。

このコードはテストされており、WooCommerce 3.2.xで動作します(WooCommerce 2.6.xでも動作するはずです)

オプションでCSSを移動できます<style></style>からstyles.cssアクティブな子テーマ(またはアクティブなテーマ)のファイルを作成し、この関数から削除します…


関連:

14
LoicTheAztec

私はここで古いスレッドを復活させていることを知っていますが、このコードを使用するときに発見したことは、このコードを使用すると、いくつかのテーマに表示される単一の非変動価格を停止するリスクがあることに注意する必要があることです:

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

可変製品であるかどうかに関係なく、すべての製品ページでトリガーされます。

以下のバージョンを使用すると、残りのコードを実行する前に、現在の製品が可変かどうかを確認するだけです。

    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