#php #wordpress #woocommerce #product #variations
Вопрос:
Когда какой-либо товар в моем магазине достигает 0 запасов (во всех его вариантах), мне нужно, чтобы он сделал следующее:
- Сохраните рассматриваемый продукт в виде черновика.
- Дублируйте этот продукт на новый продукт.
- Установите для каждой вариации нового продукта уровень запасов 1.
- Измените название нового продукта, чтобы оно было таким же, как у старого продукта (без добавления » (Копия)» к нему).
- Опубликуйте новый продукт.
У меня есть свой код в functions.php и он работает над дублированием продукта. Где у меня возникают проблемы, так это с получением идентификатора нового продукта, установкой его названия, а затем установкой его вариантов, чтобы у каждого было по 1 на складе. Любая помощь будет признательна!
function order_checker($order_id) { // get the order $order = new WC_Order($order_id); // get the products from the order $all_products = $order-gt;get_items(); // loop through each product in the order foreach ($all_products as $product) { // get the product object $product_object = wc_get_product($product['product_id']); // if the product is a variable product if ($product_object-gt;is_type('variable')) { // set "soldout" variable to true by default $soldout = true; // loop through the product variations and set "soldout" variable to false if they aren't all at 0 stock foreach ($product_object-gt;get_available_variations() as $variation) { if ($variation['is_in_stock']) $soldout = false; } // if the product is sold out if ($soldout) : // save it as a draft wp_update_post(array( 'ID' =gt; $product['product_id'], 'post_status' =gt; 'draft' )); // duplicate it to a new product $duplicate_product = new WC_Admin_Duplicate_Product; $new_product = $duplicate_product -gt; product_duplicate($product_object); // grab the new product ID $new_product_id = $new_product-gt;get_id(); // grab the new product title $new_product_title = get_the_title($new_product_id); // remove " (Copy)" from the new product title $new_product_title = str_replace(' (Copy)', '', $new_product_title); // get an array of variation ids for the new product $new_variation_ids = $new_product-gt;get_children(); // loop through the variation ids foreach ($new_variation_ids as $new_variation_id) { // get the variation object $variation_object = new WC_Product_variation($new_variation_id); // set the stock quantity to 1 $variation_object-gt;set_stock_quantity(1); // set the stock status to in stock $variation_object-gt;set_stock_status('instock'); // save and refresh cached data $variation_object-gt;save(); } // set new product title and publish it wp_update_post(array( 'ID' =gt; $new_product_id, 'post_title' =gt; $new_product_title, 'post_status' =gt; 'publish' )); ?gt;lt;scriptgt;console.log("This product has sold out!");lt;/scriptgt;lt;?php else : ?gt;lt;scriptgt;console.log("This product still has some options in stock!")lt;/scriptgt;lt;?php endif; } } } add_action('woocommerce_thankyou', 'order_checker', 10, 1);
Комментарии:
1. Зачем проходить все эти шаги, когда вы могли бы просто применить шаг 3 к существующему продукту? в чем преимущество других шагов?
2. Это должен быть новый продукт для отчетности и других требований моего клиента.
Ответ №1:
product_duplicate()
Функция возвращает объект WC_Product. Таким образом, вы можете получить доступ к идентификатору продукта через get_id()
функцию, как указано ниже:
$duplicate_product = new WC_Admin_Duplicate_Product; $new_product = $duplicate_product -gt; product_duplicate($product_object); $new_product_id = $new_product-gt;get_id(); // (1) GRAB THE NEW PRODUCT ID
Чтобы просмотреть варианты этого вновь созданного продукта и назначить количество, вам необходимо сначала получить идентификаторы вариантов с помощью get_children (), а затем просмотреть результаты, как показано ниже:
$new_variation_ids = $new_product-gt;get_children(); // get an array of variation ids for the newly created parent product. foreach ($new_variation_ids as $new_variation_id) { $variation_object = new WC_Product_variation($new_variation_id); // Set the stock quantity $variation_object-gt;set_stock_quantity(1); // Set the stock status $variation_object-gt;set_stock_status('instock'); // Save data (refresh cached data) $variation_object-gt;save(); }
Комментарии:
1. Спасибо, это сработало. Единственная часть, с которой у меня все еще возникают проблемы, — это обновление количества до 1 для каждой из вариаций нового продукта. Я обновил свой первоначальный вопрос, включив в него то, что у меня есть до сих пор.
2. @Dan Я добавил код в свой ответ, который может помочь вам в обновлении количества для новых вариантов продукта.