Привет. Сегодня рассмотрим как можно решить проблему, что в Prestashop не отображаются картинки товара после включения ЧПУ.

Всем известно, что лучше с ЧПУ, чем без них.

У одного из клиентов возникла такая проблема, в Prestashop не отображаются картинки товара после включения ЧПУ.

Первичный анализ проблемы вроде бы показал, что проблема зарыта в htaccess. После нескольких часов переписывания, перегенерирования и снова переписывания файла htaccess так ничего и не произошло, и при включенном ЧПУ картинки не отображались.

Поиск по форуму Prestashop также не дал ни малейшего результата. Вернее дал, но это не сработало в нашем случае.

В итоге нашли достаточно идиотское решение, но тем не менее работающее для нашего клиента, и возможно и для вас тоже (кстати сказать, не все решения с форума Prestashop сработали и для остальных).

Итак, способы решения:

Способы решения, если в Prestashop не отображаются картинки товара после включения ЧПУ

Способ 1: перегенерировать htaccess файл. Это сделать достаточно просто, и возможно это сработает. Суть в том, что в htaccess файл кто-то или что-то могли внести правки, которые мешают работать, или же файл не был перегенерировать после смены некоторых конфигураций. Так или иначе, во вкладке Инструменты > Генераторы попробуйте перегенерировать файл htaccess. (лучше сначала сделать бекап, а потом играть).

Способ 2: назначить рекурсивно для всей папки img в корне сайта права 777. Говорят, это можно помочь, но скорее всего в том случае, если у вас был криво перенесен сайт или сбились права на папки. По умолчанию должны быть права 757, но на форуме специалисты рекомендуют 777.

Способ 3: перегенерировать все на свете. Рекомендуют выключить/включит ЧПУ, перегенерировать htaccess, и перегенерировать миниатюры картинок. Кому-то помогло, но не нам. Скорее всего поможет, если картинки в принципе не отображаются.

Способ 4: наш, идиотский :) Я называю его «умный гору обойдет», потому, что для решения этой проблемы мы пошли в обход. У нас без ЧПУ картинки отображались отлично, а вот с включенным ЧПУ — нет. Поскольку все труды не увенчались успехом, было принято решение сделать все наоборот, а именно запретить престашоп генерировать ЧПУ ссылки на картинки, при этом позволить генерировать ЧПУ ссылки на товары и категории. Так и сделали. Все это добро лежит в файле classes/Link.php, в функции getImageLink.

В этой функции в 2-х местах генерируется ссылка на картинку, в зависимости от того, включен ЧПУ или нет. Вот если сделать так, чтобы в обоих случаях генерировалась ссылка на картинку без ЧПУ, то у нас все заработало. Ниже привожу новый код для classes/Link.php

public function getImageLink($name, $ids, $type = null)
	{
		global $protocol_content;
		
		if (empty($protocol_content))
			$protocol_content = _PS_SSL_ENABLED_ ? 'https://' : 'http://';

		// legacy mode or default image
		if ((Configuration::get('PS_LEGACY_IMAGES') 
			&& (file_exists(_PS_PROD_IMG_DIR_.$ids.($type ? '-'.$type : '').'.jpg')))
			|| strpos($ids, 'default') !== false)
		{
			// if ($this->allow == 1)
			// 	$uri_path = __PS_BASE_URI__.$ids.($type ? '-'.$type : '').'/'.$name.'.jpg';
			// else
			// 	$uri_path = _THEME_PROD_DIR_.$ids.($type ? '-'.$type : '').'.jpg';
			$uri_path = _THEME_PROD_DIR_.$ids.($type ? '-'.$type : '').'.jpg';
		}else
		{
			// if ids if of the form id_product-id_image, we want to extract the id_image part
			$split_ids = explode('-', $ids);
			$id_image = (isset($split_ids[1]) ? $split_ids[1] : $split_ids[0]);
			
			// if ($this->allow == 1)
			// 	$uri_path = __PS_BASE_URI__.$id_image.($type ? '-'.$type : '').'/'.$name.'.jpg';
			// else
			// 	$uri_path = _THEME_PROD_DIR_.Image::getImgFolderStatic($id_image).$id_image.($type ? '-'.$type : '').'.jpg';
			$uri_path = _THEME_PROD_DIR_.Image::getImgFolderStatic($id_image).$id_image.($type ? '-'.$type : '').'.jpg';
		}
		
		return $protocol_content.Tools::getMediaServer($uri_path).$uri_path;
	}

Да, лучше всего этот код положить в папку override/classes, чтобы не портить работу сайта.

Если хотите, попробуйте скачать весь файл и загрузить его в папку override/classes/.

Скачать файл override Link.php на Github и сам код на Github