使用按钮而不是下拉菜单的 Woocommerce 产品变体选择?

Posted

技术标签:

【中文标题】使用按钮而不是下拉菜单的 Woocommerce 产品变体选择?【英文标题】:Woocommerce product variation selection with buttons instead dropdown menu? 【发布时间】:2016-08-14 18:30:00 【问题描述】:

我是 wordpress 的新手。 我正在使用 wordpress 4.5(最新)+ woocommerge 2.5.5(最新)+ 店面主题创建一个 ecommerge 网站。

我的产品有 2 种不同价格的产品。

当我从下拉菜单中选择变体时,在下拉菜单中显示变体价格。

产品详情页面有 2 个变体,如下所示:

我想用按钮而不是下拉菜单选择变体,并在产品页面上更新产品价格而不是显示在下拉列表下方。

如果我为每个变体创建不同的产品并为按钮添加自定义 html 并将每个变体产品相互链接,这可行,但这很痛苦。

如何使用按钮而不是下拉菜单进行变化选择,如下图所示

【问题讨论】:

【参考方案1】:

我使用按钮进行了变体选择,而不是使用 javascript 插件选择框。

我创建了一个插件,并在产品页面中包含了一个 js 文件,该文件为产品页面上的每个变体创建按钮并隐藏选择框。

优点:

没有更改任何 wordpress 核心、woocommerce 和店面主题的文件。

myplugin.php

define('MYPLUGIN__VERSION', '1.0');
function variant_selection_with_buttons() 
    if (is_product()) 
        #TODO serve .min.js on production
        $js_file = plugins_url('/js/variant-selection-with-buttons.js', __FILE__);

        wp_register_script(
            'variant_selection_with_buttons_js',
            $js_file,
            array('jquery'),
            MYPLUGIN__VERSION,
            true
        );

        wp_enqueue_script('variant_selection_with_buttons_js');
    

add_action( 'wp_enqueue_scripts', 'variant_selection_with_buttons');

js/variations-selection-with-buttons.js

;(function($, window, document, undefined)
    var variations = $('.variations_form').data('product_variations'),
    requiredVals = ,
    selectedVariation;

    $('.woocommerce-variation').remove();
    $('table.variations').hide();

    $(variations).each(function(i, item)
        var variationSlug;
        $.each(item['attributes'], function(key, value)
            variationSlug = value;
            return;
        );

        requiredVals[variationSlug] = 
            'price_html': item['price_html'],
            'variation_description': item['variation_description'],
        ;
    );

    var $variationChangerCon = $('<div/>', 
        'id': 'variationChangerCon',
        'style': 'margin-bottom:5px',
    );

    $variationChangerCon.append('<div class="variationBtns"/>');

    $('table.variations').find('select option').each(function(index)
        var $option = $(this);
        if (!$option.val()) return;

        if ($option.is(':selected'))
            selectedVariation =$option.val();
        

        var $button = $('<a/>', 
            'class': 'variation-btn single_add_to_cart_button button btn-info PvariationLink',
            'text': $option.text(),
            'style': 'margin-right:2px;',
        );

        $button.attr('data-slug', $option.val());
        $variationChangerCon.find('.variationBtns').append($button);

    );

    $variationChangerCon.append('<div class="variationDesc"/>');
    $variationChangerCon.insertBefore('.entry-summary div[itemprop="description"]');

    $('div.product').on('click', '.variation-btn', function()
        var $this = $(this),
            item = requiredVals[$this.data('slug')];
            itemDesc = requiredVals[$this.data('slug')];

        $('.variation-btn').removeClass('disabled');
        $this.addClass('disabled');
        $('table.variations select').val($this.data('slug')).trigger('change')

        $('.entry-summary div[itemprop="offers"] p.price')
        .html(item['price_html'])
        $variationChangerCon.find('.variationDesc').html(item['variation_description']);
    );


    if (selectedVariation) 
        $('.variationBtns .variation-btn[data-slug="'+ selectedVariation +'"]').trigger('click');

     else 
        /*
            If default variation not selected in admin pane
            `selectedVariation` become undefined . So select first variation/
        */

        $('.variationBtns .variation-btn:eq(0)').trigger('click');

    
)( jQuery, window, document, undefined );

【讨论】:

$variationChangerCon.insertBefore('.entry-summary div[itemprop="description"'); 行似乎缺少右方括号 (])?

以上是关于使用按钮而不是下拉菜单的 Woocommerce 产品变体选择?的主要内容,如果未能解决你的问题,请参考以下文章

Tailwindcss 下拉项目飞到屏幕边缘而不是下拉按钮下方

在悬停时制作 Twitter Bootstrap 菜单下拉菜单,而不是轻松点击(解决方案)

单击下拉菜单按钮时引导打开链接

Bootstrap 4,在导航菜单项中使用多个下拉按钮

始终在带有 flexbox 的按钮下方直接显示下拉菜单

Jquery下拉菜单单击始终打开