問題描述
我需要在單個產品中添加一個帶有自定義價格的選擇,如下面的屏幕截圖所示;
I need to add a select with a custom price in the single product as seen in the screenshots below;
這個想法是,通過從 (select) 中選擇一個選項,您可以將其提高到基本價格.
The idea is that by selecting an option from (select) you can increase it to the base price.
不使用變體,因為我的想法是做更多的事情,但我需要關于如何做到這一點的幫助.
Without using the variations, since my idea is to do other things more, but I need help on how to do this.
我已經看到了稱為附加組件"的插件,但我不想使用插件.
I've seen plugins that do it are called "Add-On" but I do not want to use a plugin.
推薦答案
要在簡單產品(如可變產品)中添加一個選擇字段,該字段將根據下拉選擇的值更新基本價格,請嘗試以下操作:
To add a select field in simple products (like in variable products) that will update base price depending on the dopdown selected value, try this:
// 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 文件中.經過測試和工作.
Code goes in function.php file of your active child theme (or active theme). Tested and work.
這篇關于在 Woocommerce 簡單產品中添加一個將更改價格的選擇字段的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!