【问题标题】:Get currently selected variation and data from Woocommerce variable product [duplicate]从 Woocommerce 可变产品中获取当前选择的变体和数据 [重复]
【发布时间】:2019-03-03 04:09:09
【问题描述】:

情况:我在 Wordpress WooCommerce 商店中有一堆可变产品。在前端有一个带有多个选择输入的表单,允许用户在将产品添加到购物车之前对其进行配置。价格和其他信息会因可能的变化而变化,因此我需要跟踪这一点。

目标:用户更改表单后,Woocommerce 将使用新选择的变体的 ID 更新隐藏字段 input.variation_id。每当这种情况发生变化时,我都想知道。

显然,有一些东西可以跟踪变化,效果很好:

$( ".variations_form" ).on( "woocommerce_variation_select_change", function () {
    console.log('form has changed'); // fires correctly
} );

我还能够读取该隐藏字段的值,在它被更改之前:

var id = $('input.variation_id').val();
console.log( id ); // returns correct value

问题:但是当我尝试调用该函数内部的值时,我将无法工作。

$( ".variations_form" ).on( "woocommerce_variation_select_change", function () {
    var id = $('input.variation_id').val();
    console.log( id ); // fires, but returns empty
} );

我已经尝试了所有想到的东西。如果我直接在浏览器控制台中输入它,它可以工作,但是当我尝试使用上面的函数获取它时,它是空的。我能做什么?

我之前曾与 $('form.variations_form select').change(...); 合作过,但它会弄乱变化,我想确保 Woocommerce 在我执行操作之前已更新所有信息。

【问题讨论】:

    标签: jquery forms woocommerce variations


    【解决方案1】:

    要在单变量产品页面上使用 jQuery 获取选定的变体 ID(和/或任何特定的可用变体数据),请使用以下命令:

    add_action( 'woocommerce_before_single_variation',
     'action_wc_before_single_variation' );
    function action_wc_before_single_variation() {
        ?>
        <script type="text/javascript">
        (function($){
            $('form.variations_form').on('show_variation', function(event, data){
                console.log( data.variation_id );      // The variation Id  <===  <===
    
                console.log( data.attributes );        // The variation attributes
                console.log( data.availability_html ); // The formatted stock status
                console.log( data.dimensions );        // The dimensions data
                console.log( data.dimensions_html );   // The formatted dimensions
                console.log( data.display_price );     // The raw price (float)
                console.log( data.display_regular_price ); // The raw regular price (float)
                console.log( data.image );             // The image data
                console.log( data.image_id );          // The image ID (int)
                console.log( data.is_downloadable );   // Is downloadable (boolean)
                console.log( data.is_in_stock );       // Is in stock (boolean)
                console.log( data.is_purchasable );    // Is purchasable (boolean)
                console.log( data.is_sold_individually ); // Is sold individually (yes or no)
                console.log( data.is_virtual );        // Is vistual (boolean)
                console.log( data.max_qty );           // Max quantity (int)
                console.log( data.min_qty );           // Min quantity (int)
                console.log( data.price_html );        // Formatted displayed price
                console.log( data.sku );               // The variation SKU
                console.log( data.variation_description ); // The variation description
                console.log( data.variation_is_active );   // Is variation active (boolean)
                console.log( data.variation_is_visible );  // Is variation visible (boolean)
                console.log( data.weight );            // The weight (float)
                console.log( data.weight_html );       // The formatted weight
            });
        })(jQuery);
        </script>
        <?php
    }
    

    代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。

    【讨论】:

    • 谢谢。 blur 和 change 事件都对我不起作用,因为它们会在变体 ID 更新之前触发。所以,至少在我的情况下,我得到的是以前的 id。不过,下面的答案 (on( "show_variation", function ( event, variation )) 对我有用。
    • @MoriWaan 您有这种行为是因为您确实进行了一些其他自定义,这些自定义正在改变 Woocommerce 的默认行为。在具有店面主题的最后一个 woocommerce 版本中,我的代码运行良好,并且我在一段时间以来一直使用它来开发我的客户。当然,您可以使用表单中的其他委派事件来使其正常工作……“模糊”事件自 woocommerce 版本 2+ 起适用于可变产品的产品属性选择字段。
    • 这可能是因为可能的变化太多。它适用于那些只有少数可能性的人,但对于其他人来说,当 Woocommerce 使用 ajax 加载详细信息时,它不会。
    • @MoriWaan 抱歉,这不是真的,我只是用一个有很多变体的产品进行了测试,它与blur 事件完美配合。
    • 它正在工作。我可以通过console.log(data.is_in_stock)检查库存状态;现在我需要检查库存状态是否处于缺货状态。如何检查?
    【解决方案2】:

    我或许已经找到了答案: woocommerce_variation_select_change 看起来就像一个通知器,而所需的操作可以通过以下方式完成:

    $( ".single_variation_wrap" ).on( "show_variation", function ( event, variation ) {
        console.log( variation ); // fires correctly and returns a Woocommerce product object
    } );
    

    在这里找到: https://sarathlal.com/get-variation-product-data-on-selecting-variation-options-woocommerce/

    【讨论】:

      【解决方案3】:

      我设法按照我的意愿完成了这项工作。那是

      • 选择变体时调用页面重新加载
      • 将变体 ID 值作为属性传递到 URL 中,我可以在使用 $_GET 在单个页面上重新加载后对其进行处理
      • 保留所选选项

      我在下面调用脚本:

      add_action( 'woocommerce_before_add_to_cart_quantity', 'xenon_variation_modification' );
      

      函数 xenon_variation_modification() {

      global $product;
      
      if ( $product->is_type('variable') ) {
      
          global $post;
          ?>
          <script>
              jQuery(function($){
                  setTimeout( function(){
                      $( ".single_variation_wrap" ).on( "show_variation", function ( event, variation ) {
                          //alert( variation.variation_id );
                          console.log( variation.variation_id );
      
      
                          var url = '<?php echo get_permalink($post->ID);?>';
                          //$('input.variation_id').change( function(){
      
      
                          console.log('You just selected variation #' + variation.variation_id);
                          var attributes = [];
                          var allAttributesSet = true;
                          $('table.variations select').each(function() {
                              var value = $(this).val();
                              if (value) {
                                  attributes.push({
                                      id: $(this).attr('name'),
                                      value: value
                                  });
                              } else {
                                  allAttributesSet = false;
                              }
                          });
                          if (allAttributesSet) {
                              $.each(attributes,function(key, val) {
                                  var attributeSlug = val.id.replace('attribute_pa_','');
                                  url = url +'?variation_id='+ variation.variation_id +'&'+attributeSlug+'=' + val.value;
                              });
                              console.log('Relocating #' + variation.variation_id);
                              //window.location.replace(url);
                              window.location.href = url;
                          }
      
                      } );
                  }, 400 );
      
              });
          </script>
          <?php
      }
      

      }

      我在以下来源对此进行了研究:

      Get currently selected variation id from Woocommerce variable product

      https://sarathlal.com/get-variation-product-data-on-selecting-variation-options-woocommerce/

      https://wordpress.stackexchange.com/questions/280125/custom-url-for-each-product-variation-rewrite-rules

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 1970-01-01
        • 2018-07-20
        • 1970-01-01
        • 2019-03-08
        • 2018-03-17
        • 1970-01-01
        • 2017-12-23
        • 2020-11-07
        相关资源
        最近更新 更多