meta_exists(self::META) && in_array($product->get_status(), ['trash', 'private', 'draft'], true); if ($action === 'none' || $alreadyHidden) { return; } if (!$product->meta_exists(self::META)) { $product->update_meta_data(self::META, $product->get_status()); } if ($product instanceof WC_Product_Variation) { $product->set_status('private'); // вариации не бывают черновиками $product->save(); } elseif ($action === 'trash') { $product->save(); $product->delete(false); } else { $product->set_status('draft'); $product->save(); } Log::debug('Скрыт товар #' . $product->get_id() . ' (' . $action . ')'); } public static function isHidden(WC_Product $product): bool { return $product->meta_exists(self::META); } /** * Убран вручную (корзина без нашей пометки) — такой товар обмен не трогает. */ /** * Товар помечен на удаление в 1С — скрываем его и его переводы. */ public static function hideWithTranslations(WC_Product $product, string $guid): void { self::hide($product); foreach (Repo::translationIds($guid, $product->get_id()) as $id) { $translation = wc_get_product($id); if ($translation instanceof WC_Product) { self::hide($translation); } } } /** * Вернуть переводы, скрытые обменом вместе с оригиналом. */ public static function restoreTranslations(WC_Product $product, string $guid): void { foreach (Repo::translationIds($guid, $product->get_id()) as $id) { $translation = wc_get_product($id); if ($translation instanceof WC_Product && $translation->meta_exists(self::META)) { self::restore($translation)->save(); } } } public static function trashedByUser(WC_Product $product): bool { return $product->get_status() === 'trash' && !$product->meta_exists(self::META); } /** * Возвращает прежний статус товару, который скрыл обмен. Изменения сохраняет вызывающий. */ public static function restore(WC_Product $product): WC_Product { if (!$product->meta_exists(self::META)) { return $product; } $previous = (string) $product->get_meta(self::META); if ($product->get_status() === 'trash') { wp_untrash_post($product->get_id()); $product = wc_get_product($product->get_id()) ?: $product; } $product->set_status(in_array($previous, self::RESTORABLE, true) ? $previous : 'publish'); $product->delete_meta_data(self::META); Log::debug('Возвращён товар, с которого в 1С сняли пометку удаления: #' . $product->get_id()); return $product; } }