Программно дублируйте продукт WooCommerce, если уровень запасов всех вариантов равен 0

#php #wordpress #woocommerce #product #variations

Вопрос:

Когда какой-либо товар в моем магазине достигает 0 запасов (во всех его вариантах), мне нужно, чтобы он сделал следующее:

  1. Сохраните рассматриваемый продукт в виде черновика.
  2. Дублируйте этот продукт на новый продукт.
  3. Установите для каждой вариации нового продукта уровень запасов 1.
  4. Измените название нового продукта, чтобы оно было таким же, как у старого продукта (без добавления » (Копия)» к нему).
  5. Опубликуйте новый продукт.

У меня есть свой код в 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 Я добавил код в свой ответ, который может помочь вам в обновлении количества для новых вариантов продукта.