Изменить количество товаров в корзине для определенных товаров в woocommerce

Могу ли я изменить количество WooCommerce в каком-то конкретном продукте?

Я пытался:

global $woocommerce;
    $items = $woocommerce->cart->get_cart();
    foreach($items as $item => $values) { 
        $_product = $values['data']->post; 
        echo "<b>".$_product->post_title.'</b>  <br> Quantity: '.$values['quantity'].'<br>'; 
        $price = get_post_meta($values['product_id'] , '_price', true);
        echo "  Price: ".$price."<br>";
    } 

Как получить идентификатор продукта в корзину?

2 ответа

Решение

Чтобы изменить количество, см. После этого кода. Вот ваш повторный код:

foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { 
    $product = $cart_item['data']; // Get an instance of the WC_Product object
    echo "<b>".$product->get_title().'</b>  <br> Quantity: '.$cart_item['quantity'].'<br>'; 
    echo "  Price: ".$product->get_price()."<br>";
} 

Обновлено: теперь, чтобы изменить количество для определенных продуктов, вам нужно будет использовать эту пользовательскую функцию, подключенную woocommerce_before_calculate_totals Хук действия:

add_action('woocommerce_before_calculate_totals', 'change_cart_item_quantities', 20, 1 );
function change_cart_item_quantities ( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    // HERE below define your specific products IDs
    $specific_ids = array(37, 51);
    $new_qty = 1; // New quantity

    // Checking cart items
    foreach( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product_id = $cart_item['data']->get_id();
        // Check for specific product IDs and change quantity
        if( in_array( $product_id, $specific_ids ) && $cart_item['quantity'] != $new_qty ){
            $cart->set_quantity( $cart_item_key, $new_qty ); // Change quantity
        }
    }
}

Код помещается в файл function.php активной дочерней темы (или активной темы).

Проверено и работает

Мне нужно отображать вес брутто и вес нетто продуктов и изменять вес брутто и вес нетто в зависимости от количества. При изменении количества также должны измениться вес нетто и вес брутто. Он отлично работал на странице одного продукта, в то время как переход к сгруппированным продуктам не мог этого достичь.

Вот мой единственный продукт, который работает нормально: https://hamarafresh.com/product/salmon/

Вот мои сгруппированные продукты не работают: https://hamarafresh.com/product/lady-fish/

Я получаю вес брутто и вес нетто из настраиваемого поля.

      add_action( 'woocommerce_after_quantity_input_field', 'woocommerce_total_product_price', 31 );
    function woocommerce_total_product_price() {
        
         if ( is_product() ) {
             
        global $woocommerce, $product;
        
        $gross_weight = get_post_custom_values($key = 'gross_weight');
           $net_weight = get_post_custom_values($key = 'net_weight');
        get_post_meta( $post_id, $key, $single );
        // let's setup our divs
      ?>
    <?php $netweight5= esc_html( get_post_meta( get_the_ID(), 'net_weight', true ) ); ?>
                
    <?php $grossweight5= esc_html( get_post_meta( get_the_ID(), 'gross_weight', true ) ); ?>
    
                <?php
          echo sprintf('<div id="net_weight_disp" style="margin-bottom:10px; margin-top:7px;">%s %s</div>',__('Net Weight:'),'<span class="price">'.$netweight5.'</span>');
        
        echo sprintf('<div id="gross_weight_disp" style="margin-bottom:10px; margin-top:7px;">%s %s</div>',__('Gross Weight:'),'<span class="price">'.$grossweight5.'</span>');
        
          echo sprintf('<div id="product_total_price" style="margin-bottom:20px; text-align: center;">%s %s</div>',__('Product Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
         
        
        ?>
            <script>
                jQuery(function($){
                    
                    var price = <?php echo $product->get_price(); ?>,
          
                        currency = '<?php echo get_woocommerce_currency_symbol(); ?>';
                    
    <?php   $net_weight = get_post_custom_values($key = 'net_weight'); ?>;
                    
                    <?php $netweight5= esc_html( get_post_meta( get_the_ID(), 'net_weight', true ) );   ?>;
                    
                     var net_weightt = <?php echo $netweight5; ?>;  
                     
                     
                     <?php   $gross_weight = get_post_custom_values($key = 'gross_weight'); ?>;
                        <?php $grossweight5= esc_html( get_post_meta( get_the_ID(), 'gross_weight', true ) );   ?>;
                     var gross_weightt = <?php echo $grossweight5 ?>;   
    
                     
                     
                     
                    $('[name=quantity]').change(function(){
                        if (!(this.value < 0.5)) {
                            
                            var net_weighttt = (net_weightt* this.value);
                            var gross_weighttt = (gross_weightt* this.value);
                            var product_total = parseFloat(price * this.value);
    
                            $('#product_total_price .price').html( currency + product_total.toFixed(2));
                            
                         $('#net_weight_disp .price').html( currency + net_weighttt.toFixed(2));
                            
                             $('#gross_weight_disp .price').html( currency + gross_weighttt.toFixed(2));
    
                        }
                    });
                });
            </script>
        <?php
    }
    
    }

Другие вопросы по тегам