我希望在我的 woocommerce 网站的某些产品页面中添加一个复选框,当客户在将产品添加到购物车之前选择该复选框时,该复选框会增加额外费用。我们希望显示选项来验证他们必须上传到我们网站的设计。
此代码段适用于一个产品单元(数量 x1:100e + 验证 3,99e = 总计 103,99e),但如果客户需要多个相同产品单元,则额外成本将乘以数量(数量x2:200e + 验证 3,99e = 总计 207,98e)。
这是没有意义的,因为他们上传的设计对于该独特产品的一个或多个单元是相同的。我使用了迭代,因为客户可能想在不同的产品中选择复选框。
// Agregar la checkbox en la página del producto
add_action('woocommerce_before_add_to_cart_button', 'agregar_checkbox_verificacion_diseno');
function agregar_checkbox_verificacion_diseno() {
global $product;
// Verificar si el producto pertenece a las categorías excluidas
$excluded_categories = array('mastiles', 'fly-banners', 'banderas-institucionales');
$product_categories = wp_get_post_terms($product->get_id(), 'product_cat', array('fields' => 'slugs'));
if (!empty(array_intersect($excluded_categories, $product_categories))) {
return; // No mostrar la casilla de verificación para estos productos
}
// Mostrar la casilla de verificación para otros productos
echo '<p class="form-row verificacion-diseno">
<label><input type="checkbox" name="verificacion_diseno" id="verificacion_diseno"> <span class="verificacion-diseno-title">Verificación del diseño (+3,99€)</span><br><span class="verificacion-diseno-desc">Nuestro equipo de impresión revisará y verificará tu diseño, y te enviará un archivo a modo de boceto del producto final</span></label>
</p>';
}
// Procesar la selección de la checkbox
add_filter('woocommerce_add_cart_item_data', 'procesar_checkbox_verificacion_diseno', 10, 2);
function procesar_checkbox_verificacion_diseno($cart_item_data, $product_id) {
global $product;
// Verificar si el producto pertenece a las categorías excluidas
$excluded_categories = array('mastiles', 'fly-banners', 'banderas-institucionales');
$product_categories = wp_get_post_terms($product_id, 'product_cat', array('fields' => 'slugs'));
if (!empty(array_intersect($excluded_categories, $product_categories))) {
return $cart_item_data; // No aplicar la funcionalidad para estos productos
}
// Aplicar la funcionalidad para otros productos
if (isset($_POST['verificacion_diseno'])) {
$cart_item_data['verificacion_diseno'] = true;
}
return $cart_item_data;
}
// Agregar el costo adicional al precio del producto en el carrito
add_action('woocommerce_before_calculate_totals', 'agregar_costo_checkbox_verificacion_diseno');
function agregar_costo_checkbox_verificacion_diseno($cart) {
if (is_admin() && !defined('DOING_AJAX'))
return;
// Iterar a través de los elementos del carrito
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
if (isset($cart_item['verificacion_diseno'])) {
// Obtener el precio del producto
$product_price = $cart_item['data']->get_price();
// Agregar el costo adicional
$extra_cost = 3.99;
$cart_item['data']->set_price($product_price + $extra_cost);
}
}
}
// Mostrar la anotación en el carrito y el checkout
add_filter('woocommerce_get_item_data', 'mostrar_anotacion_checkbox_verificacion_diseno', 10, 2);
function mostrar_anotacion_checkbox_verificacion_diseno($item_data, $cart_item) {
if (isset($cart_item['verificacion_diseno'])) {
$item_data[] = array(
'key' => 'Verificación del diseño',
'value' => '+3,99€',
);
}
return $item_data;
}
// Agregar estilos CSS
add_action('wp_head', 'verificacion_diseno_styles');
function verificacion_diseno_styles() {
echo '<style>
.verificacion-diseno-title { font-size: 16px; }
.verificacion-diseno-desc { font-size: 14px; font-weight: normal; color: #636363; }
.verificacion-diseno { margin-bottom: 20px; }
</style>';
}
有人可以帮我解决这个问题吗?我试图将每个产品的额外成本限制为 3,99e,但该片段根本不起作用。
为了避免您的问题,请使用以下替换功能:
// Agregar el costo adicional al precio del producto en el carrito
add_action('woocommerce_before_calculate_totals', 'add checkbox_verificacion_diseno');
function agregar_costo_checkbox_verificacion_diseno($cart) {
if (is_admin() && !defined('DOING_AJAX'))
return;
foreach ($cart->get_cart() as $item) {
if (isset($item['verificacion_diseno'])) {
$product_price = $item['data']->get_price();
$extra_cost = 3.99;
$item['data']->set_price($product_price + ($extra_cost / $item['quantity']));
}
}
}
如您所见,此选项成本现在按购物车商品数量划分。
然后添加以下挂钩函数,用于显示产品价格:
add_filter( 'woocommerce_cart_item_price', 'display_cart_item_price_html', 20, 2 );
function display_cart_item_price_html( $price_html, $cart_item ) {
if( ! isset($cart_item['extra_options']) )
return $price_html;
$product = wc_get_product($cart_item['variation_id'] > 0 ? : $cart_item['product_id']);
if ( WC()->cart->display_prices_including_tax() ) {
$price = wc_get_price_including_tax($product);
} else {
$price = wc_get_price_excluding_tax($product);
}
return wc_price( $price );
}
应该可以。