• Уважаемые пользователи!

    Рады сообщить, что наш сайт был исключён из реестр РКН. В связи с этим сайт доступен без использования VPN.

    Выражаем всем огромную благодарность за помощь в решение данной проблемы.

    Спасибо!

Максимальное количество не отрабатывает в ajax корзине WooCommerce

Anastasiya96

Разрушитель (V)
Сообщения
135
Симпатии
65
Баллы
4 176
в вукомерс у товара ставлю максимальное количество которое доступно для продажи за 1 раз, все замечательно отрабатывает на странице товара и в корзине. но на сайте так же есть ajax корзина и в ней мне дает возможность увеличивать количество данного товара неограниченно. нашла файл отвечающий за эту ajax корзину

PHP:
<?php
class Generic_Class_Mini_Ajax_Cart {

    private $cartitems;
    private $_product;
    private $getProductDetail;
    private $price;

    function __construct() {
        add_action('wp_ajax_ajax_mini_cart_open', array($this,'ajax_mini_cart_open_func'));
        add_action('wp_ajax_nopriv_ajax_mini_cart_open', array($this,'ajax_mini_cart_open_func'));
        add_action('wp_ajax_ajax_mini_cart_update', array($this,'ajax_mini_cart_update_func'));
        add_action('wp_ajax_nopriv_ajax_mini_cart_update', array($this,'ajax_mini_cart_update_func'));
        add_action('wp_ajax_ajax_pdp_cart_update', array($this,'ajax_pdp_cart_update_func'));
         add_action('wp_ajax_nopriv_ajax_pdp_cart_update', array($this,'ajax_pdp_cart_update_func'));
        add_action('wp_ajax_ajax_mini_cart_remove', array($this,'ajax_mini_cart_remove_func'));
        add_action('wp_ajax_nopriv_ajax_mini_cart_remove', array($this,'ajax_mini_cart_remove_func'));
    }

    function ajax_mini_cart_open_func() {

        if (isset($_POST['action']) && $_POST['action'] == "ajax_mini_cart_open") {
            ob_start();
          global $woocommerce;
          $this->cartitems = $woocommerce->cart->get_cart();?>
          <h2 class="text-center">Your Cart</h2>
          <h5 class="text-center text-uppercase mini-cart-count"><span><?php echo count($this->cartitems)>1 ? count($this->cartitems).' items': count($this->cartitems).' item';?></span> in your cart</h5>
          <?php
           if(!empty($this->cartitems)) {
             foreach($this->cartitems as $item => $values) {             
                $this->_product =  wc_get_product( $values['data']->get_id() );
                $this->getProductDetail = wc_get_product( $values['product_id'] );
                $this->price = get_post_meta($values['product_id'] , '_price', true);
                $max_qty_allowed = apply_filters( 'woocommerce_quantity_input_max', -1, $values['data'] );
                var_dump($max_qty_allowed);
                $max_stock_value = $this->_product->get_stock_quantity();
                $max_value = ($max_qty_allowed) ? $max_qty_allowed : $max_stock_value;
          ?>
                <div class="minicart-product-row border-bottom pt-3 pb-2" id="item-<?php echo $values['data']->get_id(); ?>">
                    <div class="row align-items-center">
                        <div class="col-5 col-md-3">
                            <img src="<?php echo get_the_post_thumbnail_url($values['data']->get_id(),'thumbnail'); ?>"  draggable="false">
                        </div>
                        <div class="col-7 col-md-9">
                            <h4 class="font-weight-bold mb-1 mb-md-0 cart-product-title"><a href="<?php echo get_permalink($values['data']->get_id());?>"><?php echo $this->_product->get_title();?></a></h4>
                            <p class="mb-1"><?php echo $this->_product->get_price_html();//get_woocommerce_currency_symbol().' '.(number_format($this->price,2));?></p>
                            <p>Available to order</p>
                            <p class="text-pink err_cart"></p>
                            <div id="minicartQty" class="minicart-quatity-box clearfix mb-2">
                              <input type="hidden" name="maxstock" class="maxstock-<?php echo $values['data']->get_id(); ?>" value="<?php echo $max_value; ?>">
                              <input type="hidden" name="cartkey" class="cartkey-<?php echo $values['data']->get_id(); ?>" value="<?php echo $item;?>">
                                  <button type="button" data-id="<?php echo $values['data']->get_id(); ?>" class="sub minicart-qty-minus float-left">-</button>
                                  <input name="minicart-quantity" id="minicart-quantity" class="float-left qty-<?php echo $values['data']->get_id(); ?>" type="text"
                                  readonly="true"  value="<?php echo $values['quantity'];?>" min="1" max="" />
                                  <button type="button" data-id="<?php echo $values['data']->get_id(); ?>" class="add minicart-qty-plus float-left">+</button>
                            </div>
                            <p class="mb-0"><a href="javascript:void(0);" data-id="<?php echo $values['data']->get_id(); ?>" class='mini-cart-remove'>Remove</a></p>
                        </div>
                    </div>
                </div>
                <?php
              }
            }else{
                echo "Your cart is empty";
            }
            echo ob_get_clean();
            die();
        }
    }

    function ajax_mini_cart_update_func() {
        if (isset($_POST['action']) && $_POST['action'] == "ajax_mini_cart_update") {
            global $woocommerce;
            echo $woocommerce->cart->set_quantity($_POST['cartkey'], $_POST['quantity']);
            die();
        }
    }

    function ajax_mini_cart_remove_func() {
        if (isset($_POST['action']) && $_POST['action'] == "ajax_mini_cart_remove") {
            global $woocommerce;
            echo $woocommerce->cart->remove_cart_item( $_POST['cartkey'] );
            die();
        }
    }

    function ajax_pdp_cart_update_func() {
      if (isset($_POST['action']) && $_POST['action'] == "ajax_pdp_cart_update") {
         global $woocommerce;
         $calculated_qty = 0;
         $list = array();
         $this->cartitems = $woocommerce->cart->get_cart();
         if(!empty($this->cartitems)) {
          $flag=0; //indicator to check if the product is present in cart
           foreach($this->cartitems as $item => $values) {
              if($_POST['product_id']==$values['product_id'])
              {
                $flag++;
                $stock_qty = get_post_meta($values['product_id'] , '_stock', true); //number of stock
                $total_qty = $_POST['quantity'] + $values['quantity']; //newly added qty+already added qty
                $max_qty_allowed = apply_filters( 'woocommerce_quantity_input_max', null, $values['data'] );
                $max_value = ($max_qty_allowed) ? $max_qty_allowed : $stock_qty;
                if($max_value && $total_qty >= $max_value)
                {
                  $calculated_qty = $max_value - $values['quantity'];
                  $calculated_qty = ($calculated_qty < 1)? -1 : $calculated_qty;
                  // if status parameter is 1 it indicates that max stock qty reached
                  $list[] = array('qty' => $calculated_qty , 'status' => 1, 'total' => $total_qty, 'max_qty_allowed' => $max_qty_allowed, 'stock' => $stock_qty, 'max_value' => $max_value, 'alread_added' => $values['quantity'], 'newly_added' => $_POST['quantity'] );
                  echo json_encode($list);
                }else{
                  $calculated_qty = $_POST['quantity'];
                  $list[] = array('qty' => $calculated_qty , 'status' => 0);
                  echo json_encode($list);
                }
              }    
            }
            if($flag==0)
            {
              $list[] = array('qty' => $_POST['quantity'] , 'status' => 0);
              echo json_encode($list);
            }
          }else{
            $list[] = array('qty' => $_POST['quantity'] , 'status' => 0);
            echo json_encode($list);
          }
          die();
      }
    }
}

если выводить var_dump($max_qty_allowed) всегда значение int(-1), то есть как будто у данного товара нет ограничения по количеству..полагаю что фильтр apply_filters( 'woocommerce_quantity_input_max', -1, $values['data'] ) просто не отрабатывается. перепробовала уже массу способов в этой аяксовской корзине получить значение максимального количества, однако ничего не работает.

попробовала заменить этот код:
PHP:
<input type="hidden" name="maxstock" class="maxstock-<?php echo $values['data']->get_id(); ?>" value="<?php echo $max_value; ?>">
                              <input type="hidden" name="cartkey" class="cartkey-<?php echo $values['data']->get_id(); ?>" value="<?php echo $item;?>">
                                  <button type="button" data-id="<?php echo $values['data']->get_id(); ?>" class="sub minicart-qty-minus float-left">-</button>
                                  <input name="minicart-quantity" id="minicart-quantity" class="float-left qty-<?php echo $values['data']->get_id(); ?>" type="text"
                                  readonly="true"  value="<?php echo $values['quantity'];?>" min="1" max="" />
                                  <button type="button" data-id="<?php echo $values['data']->get_id(); ?>" class="add minicart-qty-plus float-left">+</button>

на код:
PHP:
woocommerce_quantity_input( $max_value, $values['data'], true );

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