Загрузка фото по URL
-
Написал небольшой скрипт по загрузке товара по ссылке и добавил в выполнение:
class r5ua_class_product_csv { // Артикул public $sku = ""; // Марка авто public $mark = ""; // Модель авто public $model = ""; // Год public $year = ""; // Название public $title = ""; // Объем движка public $engine_capacity = ""; // Тип топлива public $fuel_type = ""; // КПП public $transmission = ""; // OEM public $oem = ""; // Описание public $description; // Склад(Адрес) public $address = ""; // Цена public $price = ""; // Список фото public $images = array(); // Совместимые (список моделей на который пойдут) (пока в виде текста) public $compatible = ""; // Тип кузова public $body_type = ""; // Цвет public $color = ""; } function r5ua_function_log_write_text($logText) { $pathFile = get_home_path() . '/logs/event_products_update.log'; $logTextAll = date('[Y-m-d H:i:s] ') . 'memory_get_usage: ' . memory_get_usage() . ': ' . $logText; file_put_contents($pathFile, $logTextAll . PHP_EOL, FILE_APPEND); unset($pathFile); unset($logTextAll); unset($logText); } function r5ua_function_products_csv_row($headerCsvCols, $itemCsvCols) { $productCsv = new r5ua_class_product_csv(); $productCsv->sku = "EMPTY"; // Size to Size if (count($headerCsvCols) == count($itemCsvCols)) { $rowCsvColsCount = count($headerCsvCols); $col_index = 0; while ($col_index < $rowCsvColsCount) { $colTitle = strval($headerCsvCols[$col_index]); $colData = $itemCsvCols[$col_index]; // В файле csv в тексте 'артикул' if ($colTitle == 'артикул') { $productCsv->sku = strval($colData); } elseif ($colTitle == 'марка') { $productCsv->mark = $colData; } elseif ($colTitle == 'модель') { $productCsv->model = $colData; } elseif ($colTitle == 'год') { $productCsv->year = $colData; } elseif ($colTitle == 'название_запчасти') { $productCsv->title = $colData; } elseif ($colTitle == 'объём') { $productCsv->engine_capacity = $colData; } elseif ($colTitle == 'тип_топлива') { $productCsv->fuel_type = $colData; } elseif ($colTitle == 'Кпп') { $productCsv->transmission = $colData; } elseif ($colTitle == 'ОЕМ') { $productCsv->oem = $colData; } elseif ($colTitle == 'описание') { $productCsv->description = $colData; } elseif ($colTitle == 'склад') { $productCsv->address = $colData; } elseif ($colTitle == 'цена') { $productCsv->price = $colData; } elseif ($colTitle == 'фото') { // Список фото через запятую $productCsv->images = explode(',', $colData); } elseif ($colTitle == 'совместимые') { $productCsv->compatible = $colData; } elseif ($colTitle == 'тип_кузова') { $productCsv->body_type = $colData; } elseif ($colTitle == 'цвет') { $productCsv->color = $colData; } // Go Next $col_index += 1; } } return $productCsv; } function r5ua_function_get_products_dict() { $args = array( 'numberposts' => -1, 'post_status' => 'published', ); $productsDict = array(); $products = wc_get_products($args); foreach ( $products as $product_one ) { // Артикул $sku_text = $product_one->get_sku(); $productsDict[$sku_text] = $product_one; unset($sku_text); } unset($products); return $productsDict; } function r5ua_function_get_product_wc($productCsv, $productsDict, &$isNewProduct) { $sku_num = $productCsv->sku; if (array_key_exists($sku_num, $productsDict)) { $product_one = $productsDict[$sku_num]; $product_id = $product_one->get_id(); unset($product_one); unset($sku_num); $isNewProduct = 0; return new WC_Product($product_id); } else { unset($sku_num); $isNewProduct = 1; return new WC_Product(); } } function r5ua_function_product_csv_to_product_wc($productCsv, $productsInsert) { // Get Product WC $isNewProduct = 0; $productWc = r5ua_function_get_product_wc($productCsv, $productsInsert, $isNewProduct); $productTitle = $productCsv->title . ' ' . $productCsv->mark . ' ' . $productCsv->model; // Product Title $productWc->set_name($productTitle); unset($productTitle); // can be publish,draft or any wordpress post status $productWc->set_status("publish"); // add the product visibility status $productWc->set_catalog_visibility('visible'); // Product Description $description_all = $productCsv->description . ' Двигатель: ' . $productCsv->fuel_type . ' ' . $productCsv->engine_capacity . ' Тип кузова: ' . $productCsv->body_type . ' Год: ' . $productCsv->year . ' Цвет: ' . $productCsv->color . ' КПП: ' . $productCsv->transmission . ' Совместимые: ' . $productCsv->compatible; $productWc->set_description($description_all); unset($description_all); //can be blank in case you don't have sku, but You can't add duplicate sku's $productWc->set_sku($productCsv->sku); // set product price //$productWc->set_price($productCsv->price); // set product regular price $productWc->set_regular_price($productCsv->price); // true or false $productWc->set_manage_stock(true); // Количество $productWc->set_stock_quantity(1); // in stock or out of stock value ('instock' or 'outofstock') $productWc->set_stock_status('instock'); // Разрешать предзаказ $productWc->set_backorders('yes'); // Отзывы $productWc->set_reviews_allowed(false); // Только 1 продукт в 1 руки $productWc->set_sold_individually(false); // array of category ids, You can get category id from WooCommerce Product Category Section of WordPress Admin // $productWc->set_category_ids(array(1,2,3)); // Сохраняем данные $productWc->save(); r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': save params' . "\r\n"); $product_attributes = array(); // OEM if ($productCsv->oem != '') { $term_taxonomy_ids = wp_set_object_terms( $productWc->get_id(), $productCsv->oem, 'pa_rs_oem', true ); $product_attributes['pa_rs_oem'] = Array( 'name'=>'pa_rs_oem', 'value'=>$productCsv->oem, 'is_visible' => '1', 'is_taxonomy' => '1', 'position' => 0 ); unset($term_taxonomy_ids); } // Address if ($productCsv->address != '') { $term_taxonomy_ids = wp_set_object_terms( $productWc->get_id(), $productCsv->address, 'pa_rs_address', true ); $product_attributes['pa_rs_address'] = Array( 'name'=>'pa_rs_address', 'value'=>$productCsv->address, 'is_visible' => '1', 'is_taxonomy' => '1', 'position' => 1 ); unset($term_taxonomy_ids); } // Марка if ($productCsv->mark != '') { $term_taxonomy_ids = wp_set_object_terms( $productWc->get_id(), $productCsv->mark, 'pa_rs_mark', true ); $product_attributes['pa_rs_mark'] = Array( 'name'=>'pa_rs_mark', 'value'=>$productCsv->mark, 'is_visible' => '0', 'is_taxonomy' => '1', 'position' => 2 ); unset($term_taxonomy_ids); } // Модель if ($productCsv->model != '') { $term_taxonomy_ids = wp_set_object_terms( $productWc->get_id(), $productCsv->model, 'pa_rs_model', true ); $product_attributes['pa_rs_model'] = Array( 'name'=>'pa_rs_model', 'value'=>$productCsv->model, 'is_visible' => '0', 'is_taxonomy' => '1', 'position' => 3 ); unset($term_taxonomy_ids); } update_post_meta( $productWc->get_id(), '_product_attributes', $product_attributes); unset($product_attributes); r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': updates attributes' . "\r\n"); // Images // Только новым продуктам загружаем фотки if ($isNewProduct == 1) { if (empty($productCsv->images) == false) { $imageIdMain = 0; $imageIdGallery = array(); foreach ( $productCsv->images as $image_one ) { r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': image : ' . strval($image_one) . ': load start ...' . "\r\n"); $imageId = 0; try { $imageId = media_sideload_image($image_one, 0, $image_one, 'id'); } catch (Exception $e) { r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': image : ' . strval($image_one) . 'Поймано исключение: ' . $e->getMessage() . "\r\n"); continue; } r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': image : ' . strval($image_one) . ': load finish' . "\r\n"); if( is_wp_error($imageId) ) { // ошибка r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': error: ' . strval($image_one) . ': bad load' . "\r\n"); } else { // добавлено if ($imageIdMain == 0) { $imageIdMain = $imageId; r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': image : ' . strval($image_one) . ': add main' . "\r\n"); } else { array_push($imageIdGallery, $imageId); r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': image : ' . strval($image_one) . ': add gallery' . "\r\n"); } } } if ($imageIdMain != 0) { r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': image : ' . strval($image_one) . ': set main start' . "\r\n"); $productWc->set_image_id($imageIdMain); r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': image : ' . strval($image_one) . ': set main finish' . "\r\n"); } unset($imageIdMain); if (empty($imageIdGallery) == false) { r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': images : set gallery start' . "\r\n"); $productWc->set_gallery_image_ids($imageIdGallery); r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': images : set gallery finish' . "\r\n"); unset($imageIdGallery); } } } r5ua_function_log_write_text('SKU: ' . strval($productCsv->sku) . ': updates images' . "\r\n"); // Сохраняем данные $productWc->save(); return $productWc; } function r5ua_function_remove_bom_utf8($text) { if(substr($text,0,3)==chr(hexdec('EF')).chr(hexdec('BB')).chr(hexdec('BF'))) { return substr($text,3); } else { return $text; } } function r5ua_function_product_remove($product) { // Сначала удаляем фото $imageIdMain = $product->get_image_id(); wp_delete_attachment( $imageIdMain, true ); unset($imageIdMain); $imageIdGallery = $product->get_gallery_image_ids(); if (empty($imageIdGallery) == false) { foreach ( $imageIdGallery as $imageId ) { wp_delete_attachment( $imageId, true ); } } unset($imageIdGallery); // Теперь удаляем продукт $product->delete(true); } function r5ua_function_products_donwload_from_url($urlData) { // Date $date_start = date("Y-m-d H:i"); echo 'START: ' . strval($date_start) . '<br />'; unset($date_start); $dataCsv = file_get_contents($urlData); // Удаляем BOM символы (если есть) $dataCsv = r5ua_function_remove_bom_utf8($dataCsv); $rowsCsv = explode("\n", $dataCsv); unset($dataCsv); $rowsCsvCount = count($rowsCsv); $headerCsvCols = explode(";", $rowsCsv[0]); $rowCsvColsCount = count($headerCsvCols); $productsInsert = r5ua_function_get_products_dict(); $productsRemove = r5ua_function_get_products_dict(); $rowIndex = 1; // Добавляем или обновляем товары из НОВОГО списка while ($rowIndex < $rowsCsvCount) { $itemCsvCols = explode(";", $rowsCsv[$rowIndex]); $productCsv = r5ua_function_products_csv_row($headerCsvCols, $itemCsvCols); // Если цена === 0 - то пропускаем if (($productCsv->price != '0') and (count($productCsv->images) != 0)) { $productWc = r5ua_function_product_csv_to_product_wc($productCsv, $productsInsert, $productsRemove); $productWcSku = $productWc->get_sku(); // Добавляем в общий список (если не было) if (array_key_exists($productWcSku, $productsInsert) == FALSE) { $productsInsert[$productWcSku] = $productWc; } // Удаляем из списка если актуальный if (array_key_exists($productWcSku, $productsRemove)) { // Убираем товар из списка на удаление (он есть в новом файле) unset($productsRemove[$productWcSku]); } r5ua_function_log_write_text('ROW: ' . strval($rowIndex) . '; SKU: ' . strval($productCsv->sku) . ': finish' . "\r\n" . "\r\n"); unset($productWc); unset($productWcSku); } unset($productCsv); unset($itemCsvCols); $rowIndex += 1; } // Удаляем товары из СТАРОГО списка (которых нет в НОВОМ) if (count($productsRemove) > 0) { foreach ( $productsRemove as $product ) { r5ua_function_product_remove($product); } } // Date $date_finish = date("Y-m-d H:i"); echo 'FINISH: ' . strval($date_finish) . '<br />'; return '<br />' . 'END!'; } // Запуск r5ua_function_products_donwload_from_url($URL_PATH);
И каждый раз зависает где то после 5-10 минут (товаров суммарно 17к), в логе вот:
[2019-08-17 20:48:27] memory_get_usage: 113333992: SKU: 11103: save params [2019-08-17 20:48:27] memory_get_usage: 113326104: SKU: 11103: updates attributes [2019-08-17 20:48:27] memory_get_usage: 113326152: SKU: 11103: image : IMG_URL: load start ... [2019-08-17 20:48:28] memory_get_usage: 113335008: SKU: 11103: image : IMG_URL: load finish [2019-08-17 20:48:28] memory_get_usage: 113335008: SKU: 11103: image : IMG_URL: add main [2019-08-17 20:48:28] memory_get_usage: 113335008: SKU: 11103: image : IMG_URL: set main start [2019-08-17 20:48:28] memory_get_usage: 113335400: SKU: 11103: image : IMG_URL: set main finish [2019-08-17 20:48:28] memory_get_usage: 113335328: SKU: 11103: updates images [2019-08-17 20:48:28] memory_get_usage: 113342280: ROW: 3457; SKU: 11103: finish [2019-08-17 20:48:29] memory_get_usage: 113366784: SKU: 14106: save params [2019-08-17 20:48:29] memory_get_usage: 113358896: SKU: 14106: updates attributes [2019-08-17 20:48:29] memory_get_usage: 113358944: SKU: 14106: image : IMG_URL: load start ... [2019-08-17 20:48:29] memory_get_usage: 113367800: SKU: 14106: image : IMG_URL: load finish [2019-08-17 20:48:29] memory_get_usage: 113367800: SKU: 14106: image : IMG_URL: add main [2019-08-17 20:48:29] memory_get_usage: 113367800: SKU: 14106: image : IMG_URL: load start ... [2019-08-17 20:48:30] memory_get_usage: 113370712: SKU: 14106: image : IMG_URL: load finish [2019-08-17 20:48:30] memory_get_usage: 113371112: SKU: 14106: image : IMG_URL: add gallery [2019-08-17 20:48:30] memory_get_usage: 113371112: SKU: 14106: image : IMG_URL: load start ... [2019-08-17 20:48:30] memory_get_usage: 113375144: SKU: 14106: image : IMG_URL: load finish [2019-08-17 20:48:30] memory_get_usage: 113375144: SKU: 14106: image : IMG_URL: add gallery [2019-08-17 20:48:30] memory_get_usage: 113375144: SKU: 14106: image : IMG_URL: load start ... [2019-08-17 20:48:31] memory_get_usage: 113379176: SKU: 14106: image : IMG_URL: load finish [2019-08-17 20:48:31] memory_get_usage: 113379176: SKU: 14106: image : IMG_URL: add gallery [2019-08-17 20:48:31] memory_get_usage: 113379176: SKU: 14106: image : IMG_URL: set main start [2019-08-17 20:48:31] memory_get_usage: 113379568: SKU: 14106: image : IMG_URL: set main finish [2019-08-17 20:48:31] memory_get_usage: 113379520: SKU: 14106: images : set gallery start [2019-08-17 20:48:31] memory_get_usage: 113379896: SKU: 14106: images : set gallery finish [2019-08-17 20:48:31] memory_get_usage: 113379472: SKU: 14106: updates images [2019-08-17 20:48:31] memory_get_usage: 113386896: ROW: 3458; SKU: 14106: finish [2019-08-17 20:48:32] memory_get_usage: 113410872: SKU: 7131: save params [2019-08-17 20:48:32] memory_get_usage: 113403200: SKU: 7131: updates attributes [2019-08-17 20:48:32] memory_get_usage: 113403256: SKU: 7131: image : IMG_URL: load start ...
Прошу помочь разобраться что не так?
- Тема «Загрузка фото по URL» закрыта для новых ответов.