每个产品的额外费用复选框

问题描述 投票:0回答:1

我希望在我的 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,但该片段根本不起作用。

php woocommerce
1个回答
0
投票

为了避免您的问题,请使用以下替换功能:

// 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 );
}

应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.