Поддержка Проблемы и решения Загрузка фото по 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 ...

    Прошу помочь разобраться что не так?

    • Тема изменена 4 года, 7 месяцев назад пользователем rofl113.
Просмотр 15 ответов — с 1 по 15 (всего 25)
  • Отваливается примерно через 5-10 минут на очередном вызове функции media_sideload_image.
    Может быть такое что хостинг душит частые запросы на добавления?

    Модератор Yui

    (@fierevere)

    永子

    если хостинг душит, то это должно отразиться в журнале ошибок PHP хостинга

    на рег-ру может быть вообще что угодно

    на рег-ру может быть вообще что угодно

    А какой хостинг популярен у владельцев WordPress?

    Модератор Yui

    (@fierevere)

    永子

    какой хостинг популярен у владельцев WordPress?

    на ваш текущий — больше всего нареканий и проблем, минимум участия техподдержки хостинга, развод на деньги непонятно за что и пинание на наш форум с вопросами, которые должны решать они.

    Спасибо за информацию!
    Буду гуглить хостинги

    А правильно ли я понимаю что для WordPress лучше выбирать VPS?

    Модератор Yui

    (@fierevere)

    永子

    для WordPress лучше выбирать VPS

    и да и нет,
    VPS — необходимость самостоятельного администрирования (виртуальной машины) сервера, того, что на обычном хостинге делают за вас системные администраторы хостинга.
    Да, есть панельки и прочие инструменты шаблонного администрирования, но вам все равно нужно представлять что вы делаете и зачем, без этого понимания может быть только хуже.

    и да и нет,
    VPS — необходимость самостоятельного администрирования (виртуальной машины) сервера, того, что на обычном хостинге делают за вас системные администраторы хостинга.
    Да, есть панельки и прочие инструменты шаблонного администрирования, но вам все равно нужно представлять что вы делаете и зачем, без этого понимания может быть только хуже.

    Хмм, я просто совсем в этом не понимаю, и читал что вроде как в VPS заявленные ресурсы все мои а в обычном хостинге они могут делиться и не равномерно. Или таких хостингов уже давно нет?

    Модератор Yui

    (@fierevere)

    永子

    я выше написала совсем не про ресурсы.

    Есть и обычные хостинги способные дать вам достаточно ресурсов,
    а есть и VPS, которые достаточно сильно снижают производительность при нагрузке, не говоря уже про IOPSы на диск (хотя сейчас почти везде используют SSD, где проблема с IOPSами на SATA диски остро не стоит)

    Я выше написала про то, что если вы берете VPS для WP, то вам придется заниматься не только WP, но и настройкой и администрированием операционной системы внутри VPS, т.е. круг работ существенно расширяется и необходимых знаний тоже.

    не понимаю, и читал

    Для начала скажите: насколько хорошо вы знаете системное и сетевое администрирование, чтобы заниматься этим самостоятельно? Какой ваш уровень знаний никсов?

    Ну или вы готовы нанять и оплачивать специалиста, который будет всем этим заниматься?

    Модератор Yui

    (@fierevere)

    永子

    кстати, насчет рекомендуемых хостингов: https://wordpress.org/hosting/
    вот, все три предоставляют достаточно ресурсов, некоторые даже дают (в разумных пределах) неограниченный объем диска. Хорошая поддержка. Все они «заточены» на WordPress.
    Один минус — буржуйские.

    *** почему они там? Потому что они спонсируют WordPress.org,
    предоставляют время разработчиков и/или иные ресурсы для развития WordPress. А вот наших хостеров там нет, потому что они этого (в достаточном объеме) не делают.

    Один минус — буржуйские.

    Этот минус на что может повлиять?
    1) Поддержка только на англ?
    2) Задержка к сайту будет выше?

    Для начала скажите: насколько хорошо вы знаете системное и сетевое администрирование, чтобы заниматься этим самостоятельно? Какой ваш уровень знаний никсов?

    Ну или вы готовы нанять и оплачивать специалиста, который будет всем этим заниматься?

    Я разработчик на C++, Ось Ubuntu. С сайтом столкнулся по просьбе друга, помогаю ему с настройкой сайта. Раньше с сайтами вообще не работал и PHP не знал.
    Так как у него требования к сайту сейчас не большие, то я вызвался помочь.

    Wordpress я уже разворачивал на виртуалке с настройках БД и т.д. Но делал я это по инструкциям из интернета. То есть не сильно вдавался в детали. И сайт локально запустился. Это кстати помогло понять что на одном хостинге (который предоставлял бесплатный режим) есть проблема в БД и после какого то количества товаров — бд падала и сайт переставал работать. Локально у меня такого не было.

    На сколько плох вариант — поставить компьютер и подключить к нему 100 Мбит в сек?

    • Ответ изменён 4 года, 7 месяцев назад пользователем rofl113.
    • Ответ изменён 4 года, 7 месяцев назад пользователем rofl113.
Просмотр 15 ответов — с 1 по 15 (всего 25)
  • Тема «Загрузка фото по URL» закрыта для новых ответов.