Anastasiya96
Разрушитель (V)
в вукомерс у товара ставлю максимальное количество которое доступно для продажи за 1 раз, все замечательно отрабатывает на странице товара и в корзине. но на сайте так же есть ajax корзина и в ней мне дает возможность увеличивать количество данного товара неограниченно. нашла файл отвечающий за эту ajax корзину
если выводить var_dump($max_qty_allowed) всегда значение int(-1), то есть как будто у данного товара нет ограничения по количеству..полагаю что фильтр apply_filters( 'woocommerce_quantity_input_max', -1, $values['data'] ) просто не отрабатывается. перепробовала уже массу способов в этой аяксовской корзине получить значение максимального количества, однако ничего не работает.
попробовала заменить этот код:
на код:
и в целом это даже сработало, но когда я на других товарах клацаю к примеру увеличить количество товара, потом закрываю и снова открываю этот попап с корзиной, то значения которые я ставила уже находясь в ней не сохраняются. есть идеи как бы это можно было исправить?
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 );
и в целом это даже сработало, но когда я на других товарах клацаю к примеру увеличить количество товара, потом закрываю и снова открываю этот попап с корзиной, то значения которые я ставила уже находясь в ней не сохраняются. есть идеи как бы это можно было исправить?