添加一个将改变Woocommerce简单产品价格的选择字段

时间:2018-04-16 16:26:50

标签: php jquery wordpress woocommerce html-select

我需要在单个商品中添加一个自定义价格的商品,如下面的屏幕截图所示;

HTML select dropdown

enter image description here

我们的想法是,通过从(选择)中选择一个选项,您可以将其增加到基本价格。

不使用这些变体,因为我的想法是更多地做其他事情,但我需要有关如何做到这一点的帮助。

我见过这样做的插件叫做“附加组件”,但我不想使用插件。

1 个答案:

答案 0 :(得分:3)

要在简单产品中添加选择字段(例如在变量产品中),这将根据所选的掺杂值更新基本价格,请尝试以下操作:

// Frontend: custom select field in product single pages
add_action( 'woocommerce_before_add_to_cart_button', 'fabric_length_product_field' );
function fabric_length_product_field() {
    global $product;

    if( $product->is_type('variable') ) return; // Not variable products

    $domain = 'woocommerce';
    $text   = array(
        __('cards', $domain),
        __('card', $domain),
        __('Total', $domain),
        get_woocommerce_currency_symbol(),
    );

    // Select Options array
    $options = array(
        ""          => __('Select package'),
        "12.00" => "1000 {$text[0]} - {$text[3]}0.012/{$text[1]} - {$text[2]} {$text[3]}12.00",
        "15.00" => "2000 {$text[0]} - {$text[3]}0.008/{$text[1]} - {$text[2]} {$text[3]}15.00",
        "20.00" => "3000 {$text[0]} - {$text[3]}0.007/{$text[1]} - {$text[2]} {$text[3]}20.00",
        "25.00" => "4000 {$text[0]} - {$text[3]}0.006/{$text[1]} - {$text[2]} {$text[3]}25.00",
    );

    // Select field
    woocommerce_form_field('cards_pack', array(
        'type'          => 'select',
        'class'         => array('my-field-class form-row-wide'),
        'label'         => __('Cards Pack selection', $domain),
        'required'      => true,
        'options'       => $options,
    ),'');

    // Data to be transmitted to jQuery
    $base_price = (float) wc_get_price_to_display( $product );
    $prices = array(
        ''      => wc_price($base_price),
        '12.00' => wc_price($base_price + 12),
        '15.00' => wc_price($base_price + 15),
        '20.00' => wc_price($base_price + 20),
        '25.00' => wc_price($base_price + 25),
    )

    // jQuery code
    ?>
    <script>
    jQuery(function($){
        var a = <?php echo json_encode($prices); ?>,
            b = 'p.price',
            c = 'select[name="cards_pack"]';

        $(c).on( 'change', function(){
            $.each( a, function( key, value ){
                if( $(c).val() == key )
                    $(b).html(value);
            });
        });
    });
    </script>
    <?php
}

// Add selected pack data as custom data to cart items
add_filter( 'woocommerce_add_cart_item_data', 'add_pack_data_to_cart_item_data', 20, 2 );
function add_pack_data_to_cart_item_data( $cart_item_data, $product_id ){
    if( ! isset($_POST['cards_pack']) )
        return $cart_item_data;

    $pack_price = (float) sanitize_text_field( $_POST['cards_pack'] );
    if( empty($pack_price) )
        return $cart_item_data;

    if($pack_price == 12.00) $cards = 1000;
    elseif($pack_price == 15.00) $cards = 2000;
    elseif($pack_price == 20.00) $cards = 3000;
    elseif($pack_price == 25.00) $cards = 4000;

    $product    = wc_get_product($product_id); // The WC_Product Object
    $base_price = (float) $product->get_price();

    // New price calculation
    $new_price = $base_price + $pack_price;

    // Prepare and save the data array
    $cart_item_data['pack_data'] = array(
        'cards'     => (int)   $cards,
        'pack'      => (int)   $pack_price,
        'new_price' => (float) $new_price,
    );
    $cart_item_data['unique_key'] = md5( microtime() . rand() ); // Make each item unique

    return $cart_item_data;
}

// Set conditionally a custom item price
add_action('woocommerce_before_calculate_totals', 'set_cutom_cart_item_price', 20, 1);
function set_cutom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach (  $cart->get_cart() as $cart_item ) {
        if ( isset( $cart_item['pack_data']['new_price'] ) )
            $cart_item['data']->set_price( $cart_item['pack_data']['new_price'] );
    }
}


// Display custom data in  checkout page
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 10, 2 );
function display_custom_cart_item_data( $cart_data, $cart_item ) {
    $domain        = 'woocommerce';

    if ( isset( $cart_item['pack_data']['new_price'] ) ){
        $cart_data[] = array('name' => __( 'Cards pack', $domain ),
            'value' => $cart_item['pack_data']['cards'] );
    }
    return $cart_data;
}

代码放在活动子主题(或活动主题)的function.php文件中。经过测试和工作。

enter image description here