// ... (начало плагина такое же) ... // ЭКСПОРТ (с исправлением точек на запятые для Excel) function bsd_handle_export($fields, $cats, $labels) { ob_end_clean(); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=bsd_products.csv'); $output = fopen('php://output', 'w'); fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); $header = []; foreach ($fields as $f) { $header[] = $labels[$f]; } fputcsv($output, $header, ';'); $args = ['limit' => -1, 'status' => 'any']; if (!empty($cats)) { $args['category'] = $cats; } $products = wc_get_products($args); foreach ($products as $product) { $row = []; foreach ($fields as $f) { switch ($f) { case 'id': $row[] = $product->get_id(); break; case 'sku': $row[] = $product->get_sku(); break; case 'name': $row[] = $product->get_name(); break; case 'price': $row[] = str_replace('.', ',', $product->get_price()); break; // Точка -> Запятая case 'stock': $row[] = $product->get_stock_quantity(); break; case 'weight': $row[] = str_replace('.', ',', $product->get_weight()); break; // Точка -> Запятая case 'length': $row[] = str_replace('.', ',', $product->get_length()); break; case 'width': $row[] = str_replace('.', ',', $product->get_width()); break; case 'height': $row[] = str_replace('.', ',', $product->get_height()); break; case 'categories': $terms = get_the_terms($product->get_id(), 'product_cat'); $row[] = $terms ? implode('|', wp_list_pluck($terms, 'name')) : ''; // Разделитель | для категорий break; default: $row[] = $product->get_meta($f); break; } } fputcsv($output, $row, ';'); } exit; } // ИМПОРТ (Обновление + Создание + Создание категорий) function bsd_handle_import() { if (!empty($_FILES['bsd_import_file']['tmp_name'])) { $file = fopen($_FILES['bsd_import_file']['tmp_name'], 'r'); fgets($file, 4); $header = fgetcsv($file, 0, ';'); $map = [ 'id' => array_search('ID (Системный)', $header), 'sku' => array_search('Артикул', $header), 'name' => array_search('Название', $header), 'price' => array_search('Цена', $header), 'stock' => array_search('Количество', $header), 'weight' => array_search('Вес (кг)', $header), 'length' => array_search('Длина (см)', $header), 'width' => array_search('Ширина (см)', $header), 'height' => array_search('Высота (см)', $header), 'cats' => array_search('Категории', $header), ]; $count_upd = 0; $count_new = 0; while (($data = fgetcsv($file, 0, ';')) !== FALSE) { $p_id = ($map['id'] !== false) ? intval($data[$map['id']]) : 0; $sku = ($map['sku'] !== false) ? trim($data[$map['sku']]) : ''; $product = null; if ($p_id > 0) { $product = wc_get_product($p_id); } elseif (!empty($sku)) { $product = wc_get_product(wc_get_product_id_by_sku($sku)); } if (!$product) { $product = new WC_Product_Simple(); $count_new++; } else { $count_upd++; } // Обработка числовых данных (Запятая -> Точка) if ($map['name'] !== false) $product->set_name($data[$map['name']]); if ($map['sku'] !== false) $product->set_sku($sku); if ($map['price'] !== false) $product->set_regular_price(str_replace(',', '.', $data[$map['price']])); if ($map['weight'] !== false) $product->set_weight(str_replace(',', '.', $data[$map['weight']])); if ($map['length'] !== false) $product->set_length(str_replace(',', '.', $data[$map['length']])); if ($map['width'] !== false) $product->set_width(str_replace(',', '.', $data[$map['width']])); if ($map['height'] !== false) $product->set_height(str_replace(',', '.', $data[$map['height']])); if ($map['stock'] !== false && $data[$map['stock']] !== '') { $product->set_manage_stock(true); $product->set_stock_quantity($data[$map['stock']]); } $product_id = $product->save(); // РАБОТА С КАТЕГОРИЯМИ if ($map['cats'] !== false && !empty($data[$map['cats']])) { $cat_names = explode('|', $data[$map['cats']]); $cat_ids = []; foreach ($cat_names as $cat_name) { $cat_name = trim($cat_name); $term = get_term_by('name', $cat_name, 'product_cat'); if (!$term) { $new_term = wp_insert_term($cat_name, 'product_cat'); if (!is_wp_error($new_term)) $cat_ids[] = $new_term['term_id']; } else { $cat_ids[] = $term->term_id; } } wp_set_object_terms($product_id, $cat_ids, 'product_cat'); } } fclose($file); echo "
Готово! Создано: $count_new, Обновлено: $count_upd