Php 将可变价格范围替换为第3部分中选择的可变价格

Php 将可变价格范围替换为第3部分中选择的可变价格,php,wordpress,woocommerce,product,variations,Php,Wordpress,Woocommerce,Product,Variations,关于WooCommerce,我想更改可变的单产品页面布局。因为,当你有一个可变产品时,你会在可变产品页面上看到这个有线价格暴涨(在产品标题下),它也会显示在商店页面上 对我来说,标准的方法是在商店和产品页面中显示产品的最低价格,并根据用户选择的变量更改价格。我不相信为什么 我可以使用此代码段删除价格范围并显示最低价格 但同样,最低价格不会因选择的变量而改变。在可变产品布局中还有两种价格。这是我当前的可变产品页面布局 因此,请任何人帮助从可变产品页面中删除价格范围,并仅显示产品的一个最低价格(

关于WooCommerce,我想更改可变的单产品页面布局。因为,当你有一个可变产品时,你会在可变产品页面上看到这个有线价格暴涨(在产品标题下),它也会显示在商店页面上

对我来说,标准的方法是在商店和产品页面中显示产品的最低价格,并根据用户选择的变量更改价格。我不相信为什么

我可以使用此代码段删除价格范围并显示最低价格

但同样,最低价格不会因选择的变量而改变。在可变产品布局中还有两种价格。这是我当前的可变产品页面布局

因此,请任何人帮助从可变产品页面中删除价格范围,并仅显示产品的一个最低价格(在产品标题下)作为默认值。因此,价格应该根据产品所具有的变量而变化。最低的价格也应该显示在商店的页面上

希望这是清楚的。如果有什么不清楚的地方,请告诉我。有关更多详细信息,请参阅所附图片

谢谢

2021年最终更新 适用于WooCommerce 4+和5+网站:


更新(2017年12月):为避免某些主题中的非可变产品问题和某些主题中的重复可用性缺陷

注意:一些插件,如德国市场或一些主题将无法使用此代码,因为它们会在钩子或html结构中进行自己的更改

这是完全可能的

  • 首先,我们删除不需要的价格。
  • 我们输出不带价格范围的可变价格,并显示最低价格。
  • 我们在一个隐藏的容器中复制这个可变价格(供jQuery脚本使用/读取)
  • 然后,我们隐藏选择的变动价格(和库存可用性)的容器
  • 在jQuery脚本的帮助下,当我们获得所选的变动价格时,我们替换变动价格(并显示库存可用性)
  • 如果客户变更,我们将更新价格。。。如果在变更过程中未显示变动价格,则会显示我们的变动价格
  • 这是代码:

    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>';
    }
    
    add_action('woocommerce_-before_-single_-product','move_-variations_-single_-price',1);
    函数移动\变化\单一\价格(){
    全球$product$post;
    如果($product->is_类型('variable')){
    //消除可变产品的价格变化
    删除行动('woocommerce\u single\u product\u summary'、'woocommerce\u template\u single\u price',10);
    //更改位置并重新插入价格变化
    添加行动('WOOMerce\u single\u product\u summary'、'replace\u variation\u single\u price',10);
    }
    }
    函数替换\变化\单一\价格(){
    全球$产品;
    //主要价格
    $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_prices($prices[0]):wc_prices($prices[0]);
    //销售价格
    $prices=array($product->get_variation_regular_prices('min',true),$product->get_variation_regular_prices('max',true));
    排序(价格);
    $saleprice=$prices[0]!=$prices[1]?sprintf('From:%1$s','woocommerce'),wc_prices($prices[0]):wc_prices($prices[0]);
    如果($price!=$saleprice&&$product->正在销售()){
    $price='.$saleprice.$product->get_price_suffix()。$price.$product->get_price_suffix()。';
    }
    ?>
    商业-变化-价格部门,
    商业-变化-可用性分部,
    部门隐藏-可变价格{
    高度:0px!重要;
    溢出:隐藏;
    位置:相对位置;
    线高:0px!重要;
    字体大小:0%!重要;
    }
    jQuery(文档).ready(函数($){
    $('select').blur(函数(){
    if(“”!=$('input.variation_id').val()){
    如果($('p.availability'))
    $('p.availability').remove();
    $('p.price').html($('div.woocommerce-variation-price>span.price').html()).append('

    '+$('div.woocommerce-variation-availability').html()+'

    '); log($('input.variation_id').val()); }否则{ $('p.price').html($('div.hidden-variable-price').html()); 如果($('p.availability')) $('p.availability').remove(); log('NULL'); } }); });
    我知道我在这里复活了一个旧线程,但我在使用这段代码时发现,您需要注意,使用这段代码,您可能会停止在某些主题上显示单一的、不可变的价格,如:

    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;
    }
    
            }
        }
    }
    
    add_action('woocommerce_在单个产品之前,'check_if_variable_first');
    函数检查\u如果变量\u first(){
    if(is_product()){
    全球$员额;
    $product=wc\U get\U product($post->ID);
    如果($product->is_类型('variable')){
    //消除可变产品的价格
    删除行动('woocommerce\u single\u product\u summary'、'woocommerce\u template\u single\u price',10);
    //更改
    添加行动('woocommerce\u single\u product\u summary'、'custom\u wc\u template\u single\u price',10);
    函数自定义\u wc\u模板
    
    add_action( 'woocommerce_before_single_product', 'move_variations_single_price', 1 );
    function move_variations_single_price(){
      global $product, $post;
      if ( $product->is_type( 'variable' ) ) {
        add_action( 'woocommerce_single_product_summary', 'replace_variation_single_price', 10 );
      }
    }
    
    function replace_variation_single_price() {
      ?>
        <style>
          .woocommerce-variation-price {
            display: none;
          }
        </style>
        <script>
          jQuery(document).ready(function($) {
            var priceselector = '.product p.price';
            var originalprice = $(priceselector).html();
    
            $( document ).on('show_variation', function() {
              $(priceselector).html($('.single_variation .woocommerce-variation-price').html());
            });
            $( document ).on('hide_variation', function() {
              $(priceselector).html(originalprice);
            });
          });
        </script>
      <?php
    }