在 Shopify 中选择新变体时价格未更新

Posted

技术标签:

【中文标题】在 Shopify 中选择新变体时价格未更新【英文标题】:Price not updating when selecting a new variant in Shopify 【发布时间】:2020-11-20 16:04:44 【问题描述】:

我正在尝试编辑 Debut 主题以更好地满足我客户的需求。每当我在 product-template.liquid 文件中编辑变体选择器时,它都会引发错误并且不会将价格更新为正确的变体。

错误:

Uncaught TypeError: Cannot read property 'available' of undefined
    at Product._initVariants (theme.js?v=785054923643579389:8098)
    at new Product (theme.js?v=785054923643579389:8010)
    at Sections._createInstance (theme.js?v=785054923643579389:47)
    at Sections.<anonymous> (theme.js?v=785054923643579389:141)
    at NodeList.forEach (<anonymous>)
    at Sections.register (theme.js?v=785054923643579389:139)
    at htmlDocument.<anonymous> (theme.js?v=785054923643579389:9467)

原始代码是这样的(按预期完美运行):

<div class="product-form__controls-group">
    % for option in product.options_with_values %
        <div class="selector-wrapper js product-form__item">
            <label for="SingleOptionSelector- forloop.index0 " >
                 option.name 
            </label>
            <select class="single-option-selector single-option-selector-section.id  product-form__input" id="SingleOptionSelector- forloop.index0 " data-index="option forloop.index ">
                % for value in option.values %
                    <option value=" value | escape "% if option.selected_value == value % selected="selected"% endif %> value </option>
                % endfor %
             </select>
        </div>
    % endfor %
</div>

我对此进行了编辑(我将两者分开,因为这是我的客户在他提出的设计中需要的):

<div class="product-form__controls-group">
    <div class="selector-wrapper js product-form__item">
        <label for="SingleOptionSelector-0">
            Material
        </label>
        <select class="single-option-selector single-option-selector- section.id  product-form__input" id="SingleOptionSelector- forloop.index0 " data-index="option forloop.index ">
            % for option in product.options_by_name['Material'].values %
                % for value in option %
                    <option value=" value | escape "% if option.selected_value == value % selected="selected"% endif %> value </option>
                % endfor %
            % endfor %
        </select>
    </div>
    <div class="selector-wrapper js product-form__item">
        <label for="SingleOptionSelector-1">
            Size
         </label>
         <select class="single-option-selector single-option-selector- section.id  product-form__input" id="SingleOptionSelector- forloop.index0 " data-index="option forloop.index ">
             % for option in product.options_by_name['Size'].values %
                 % for value in option %
                     <option value=" value | escape "% if option.selected_value == value % selected="selected"% endif %> value </option>
                 % endfor %
             % endfor %
         </select>
     </div>
</div>

如果有人可以帮助我,那就太棒了,因为 Shopify 论坛根本没有帮助。

【问题讨论】:

【参考方案1】:

您的代码不起作用,因为它没有创建 Theme JS 所期望的所需架构。所以它无法识别所选的变体。在原始代码中,使用 this 指定了一个名为 data-index 的数据属性。

data-index="option forloop.index "

但是,您没有将其更改为数值,因为您没有使用 for 循环。所以要解决这个问题,我们必须在选项数组中找到选项的位置。为此,我这样做了。

    % for product_option in product.options_with_values %
        % if product_option.name == "Material" %
            % assign material_index = forloop.index %
            
        % elsif  product_option.name == "Size" %
            % assign size_index = forloop.index %
        % endif %
    % endfor %

如果您正在使用,也包括其他选项。所以完整的工作代码是

    % for product_option in product.options_with_values %
        % if product_option.name == "Material" %
            % assign material_index = forloop.index %
            
        % elsif  product_option.name == "Size" %
            % assign size_index = forloop.index %
        % endif %
    % endfor %

    <div class="product-form__controls-group">
        <div class="selector-wrapper js product-form__item">
            <label for="SingleOptionSelector-0">
                Material
            </label>
            <select class="single-option-selector single-option-selector- section.id  product-form__input" id="SingleOptionSelector-material_index" data-index="optionmaterial_index">
                % for option in product.options_by_name['Material'].values %
                    % for value in option %
                        <option value=" value | escape "% if option.selected_value == value % selected="selected"% endif %> value </option>
                    % endfor %
                % endfor %
            </select>
        </div>
        <div class="selector-wrapper js product-form__item">
            <label for="SingleOptionSelector-1">
                Size
             </label>
             <select class="single-option-selector single-option-selector- section.id  product-form__input" id="SingleOptionSelector-size_index" data-index="optionsize_index">
                 % for option in product.options_by_name['Size'].values %
                     % for value in option %
                         <option value=" value | escape "% if option.selected_value == value % selected="selected"% endif %> value </option>
                     % endfor %
                 % endfor %
             </select>
         </div>
    </div>

【讨论】:

附加问题,现在当我想将所述变体添加到我的购物车时,它给了我这个错误:TypeError: Cannot read property 'classList' of null at Product._setCartCountBubble (theme.js?v=16941873179886687807:8536) at theme.js?v=16941873179886687807:8377 @SiemenGijbels 你确定这是因为上面的代码吗?因为它对我来说在新的 Debut 主题上工作得很好。可能你做了一些其他的自定义?

以上是关于在 Shopify 中选择新变体时价格未更新的主要内容,如果未能解决你的问题,请参考以下文章

Shopify 变体价格现在正确显示

购物车数据未在 shopify 中使用 ajax 更新

使用 WooCommerce 选择变体时更新产品页面上的价格

Shopify - 通过多个变体 ID 检索多个变体详细信息

Shopify- 获取属性形式 <select>

Shopify - 将尺寸变体从选择下拉菜单更改为按钮