Андрей CS сказал(а)
а почему вы решили, что предложеное решение в указанной теме нерабочее? вполне себе рабочее
Еще раз протестировал, понял, что код не срабатывает для бесплатного товара.
Вот мой код:
/*Ограничение товара*/ add_action('rcl_payment_order','check_sale_order',30); function check_sale_order($order_id){ $order = rcl_get_order($order_id); foreach($order->products as $product){ $maxSale = get_post_meta($product->product_id,'maxsale',true); $saleAmount = get_post_meta($product->product_id,'sales-product',true); if(!$saleAmount) $saleAmount = 0; if($saleAmount >= $maxSale){ //если достигнут предел продаж, то снимаем с продажи $values = ['1']; update_post_meta($product->product_id,'outsale', $values); } } }
Разобрался кажется, для бесплатной покупки идет другой action - rcl_insert_order.
Вот рабочий код для платного и бесплатного товара:
/*Ограничение товара*/ add_action('rcl_payment_order','check_sale_order',30); function check_sale_order($order_id){ $order = rcl_get_order($order_id); foreach($order->products as $product){ $maxSale = get_post_meta($product->product_id,'maxsale',true);// метаполе, которым ограничиваем количество товара $saleAmount = get_post_meta($product->product_id,'sales-product',true); if(!$saleAmount) $saleAmount = 0; if($saleAmount >= $maxSale){ //если достигнут предел продаж, то снимаем с продажи $values = ['1']; update_post_meta($product->product_id,'outsale', $values); } } } /*Ограничение бесплатного товара*/ add_action('rcl_insert_order','check_sale_order_free',30); function check_sale_order_free($order_id){ $order = rcl_get_order($order_id); foreach($order->products as $product){ $maxSale = get_post_meta($product->product_id,'maxsale',true); $saleAmount = get_post_meta($product->product_id,'sales-product',true); if(!$saleAmount) $saleAmount = 0; if($saleAmount >= $maxSale){ //если достигнут предел продаж, то снимаем с продажи $values = ['1']; update_post_meta($product->product_id,'outsale', $values); } } }
Для тех, кто интересуется подробностями, как это сделать.
В форме публикации товара нужно добавить два новых поля.
1 поле. Максимальное количество товаров, Meta-key: maxsale, тип - количество
2 поле. Снять с продажи, Meta-key: outsale, тип - чекбоксы, в опциях - 1
Ну и в файл функций добавить код из прошлого сообщения.
Валерий сказал(а)
Вот рабочий код для платного и бесплатного товара
похоже вы не учитываете, что в одном заказе могут быть как платные, так и бесплатные товары, как тогда поведет ваш вариант?
Хук rcl_payment_order срабатывает при оплате заказа, но если в нем будут бесплатные товары, то для них подсчет кол-ва продаж также коснется, другое дело, когда в заказе будут все товары бесплатные, тогда этот хук никогда не отработает, подойдет тот что вы указали - rcl_insert_order, но он будет срабатывать и для платных товаров, т.е. товары будут у вас считаться два раза - при создании заказа и при оплате, что неверно.
Внутри функции для хука rcl_payment_order делайте проверку на цену, если товар бесплатный, то пропускаем, а внутри функции для rcl_insert_order наоборот - если товар платный, то пропускаем.
Скорректировал код, должен быть рабочий. Спасибо Андрею за подсказки
/*Ограничение платного товара*/ add_action('rcl_payment_order','check_sale_order',30); function check_sale_order($order_id){ if(!is_user_logged_in()) return false; $order = rcl_get_order($order_id); foreach($order->products as $product){ $maxSale = get_post_meta($product->product_id,'maxsale',true); $price_products = get_post_meta($product->product_id,'price-products',true); if (($maxSale < 1)||($price_products < 1)) return false; // если нет ограничения количества или товар бесплатный - возвращаем false $saleAmount = get_post_meta($product->product_id,'sales-product',true); if(!$saleAmount) $saleAmount = 0; if($saleAmount >= $maxSale){ //если достигнут предел продаж, то снимаем с продажи $values = ['1']; update_post_meta($product->product_id,'outsale', $values); } } } /*Ограничение бесплатного товара*/ add_action('rcl_insert_order','check_sale_order_free',30); function check_sale_order_free($order_id){ $order = rcl_get_order($order_id); foreach($order->products as $product){ $maxSale = get_post_meta($product->product_id,'maxsale',true); $price_products = get_post_meta($product->product_id,'price-products',true); if (($maxSale < 1)||($price_products > 0)) return false; // если нет ограничения количества или товар платный - возвращаем false $saleAmount = get_post_meta($product->product_id,'sales-product',true); if(!$saleAmount) $saleAmount = 0; if($saleAmount >= $maxSale){ //если достигнут предел продаж, то снимаем с продажи $values = ['1']; update_post_meta($product->product_id,'outsale', $values); } } }