Ruslan Brest, rb.labtodo.com
Backend web-developer: CodeIgniter, PHP, MySQL, OpenCart, PrestaShop, MaxSite CMS

Opencart 1.5.1.3: выдача HTTP/404 для товаров, которые отключены администратором

Просмотров: 11512 RSS 16
Howto » OpenCart » SEO

В Опенкарт, если товар отключен, а внешняя ссылка на него где-то сохранилась, при переходе по ней будет отдан HTTP код 200 (OK) вместо более правильного 404 (Not Found).

Эту ситуацию исправляет одна строчка, см. патч ниже.

Спасибо: molotochek, см. http://opencartforum.ru/topic/418-%d0%bd%d0%b5-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-404/page__view__findpost__p__46795

commit 6ef5a39e9e82c4e82901ce47d5304313867afb83
Author: Ruslan Brest <rb@labtodo.com>
Date:   Tue Feb 21 17:03:00 2012 +0200
    [!] HTTP/200 => HTTP/404 для товаров, которые отключены администратором
    и других страниц с ненайденными сущностями
    
    by: molotochek
    http://opencartforum.ru/topic/418-%d0%bd%d0%b5-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-404/page__view__findpost__p__46795
diff --git a/upload/catalog/controller/product/product.php b/upload/catalog/controller/product/product.php
index c39ad77..c5579db 100644
--- a/upload/catalog/controller/product/product.php
+++ b/upload/catalog/controller/product/product.php
@@ -414,15 +414,13 @@ class ControllerProductProduct extends Controller {
       		);
 
       		$this->document->setTitle($this->language->get('text_error'));
-
       		$this->data['heading_title'] = $this->language->get('text_error');
-
       		$this->data['text_error'] = $this->language->get('text_error');
-
       		$this->data['button_continue'] = $this->language->get('button_continue');
-
       		$this->data['continue'] = $this->url->link('common/home');
 
+			$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
+
 			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 				$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
 			} else {
diff --git a/upload/catalog/controller/account/download.php b/upload/catalog/controller/account/download.php
index 7b736d2..4cb0a0d 100644
--- a/upload/catalog/controller/account/download.php
+++ b/upload/catalog/controller/account/download.php
@@ -120,12 +120,11 @@ class ControllerAccountDownload extends Controller {
 			$this->response->setOutput($this->render());
 		} else {
 			$this->data['heading_title'] = $this->language->get('heading_title');
-
 			$this->data['text_error'] = $this->language->get('text_empty');
-
 			$this->data['button_continue'] = $this->language->get('button_continue');
-
 			$this->data['continue'] = $this->url->link('account/account', '', 'SSL');
+			
+			$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
 			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 				$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
diff --git a/upload/catalog/controller/account/order.php b/upload/catalog/controller/account/order.php
index cb49bef..5006970 100644
--- a/upload/catalog/controller/account/order.php
+++ b/upload/catalog/controller/account/order.php
@@ -434,6 +434,8 @@ class ControllerAccountOrder extends Controller {
 			);
 
       		$this->data['continue'] = $this->url->link('account/order', '', 'SSL');
+      		
+      		$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
 			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 				$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
diff --git a/upload/catalog/controller/account/return.php b/upload/catalog/controller/account/return.php
index 1575ff0..b9add37 100644
--- a/upload/catalog/controller/account/return.php
+++ b/upload/catalog/controller/account/return.php
@@ -283,12 +283,11 @@ class ControllerAccountReturn extends Controller {
 			);
 
 			$this->data['heading_title'] = $this->language->get('text_return');
-
 			$this->data['text_error'] = $this->language->get('text_error');
-
 			$this->data['button_continue'] = $this->language->get('button_continue');
-
 			$this->data['continue'] = $this->url->link('account/return', '', 'SSL');
+			
+			$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
 			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 				$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
diff --git a/upload/catalog/controller/checkout/cart.php b/upload/catalog/controller/checkout/cart.php
index afc8660..964c180 100644
--- a/upload/catalog/controller/checkout/cart.php
+++ b/upload/catalog/controller/checkout/cart.php
@@ -277,12 +277,11 @@ class ControllerCheckoutCart extends Controller {
 			$this->response->setOutput($this->render());
     	} else {
       		$this->data['heading_title'] = $this->language->get('heading_title');
-
       		$this->data['text_error'] = $this->language->get('text_empty');
-
       		$this->data['button_continue'] = $this->language->get('button_continue');
-
       		$this->data['continue'] = $this->url->link('common/home');
+      		
+      		$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
 			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 				$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
diff --git a/upload/catalog/controller/error/not_found.php b/upload/catalog/controller/error/not_found.php
index 251a745..ab0758a 100644
--- a/upload/catalog/controller/error/not_found.php
+++ b/upload/catalog/controller/error/not_found.php
@@ -22,15 +22,12 @@ class ControllerErrorNotFound extends Controller {
 		}
 
 		$this->data['heading_title'] = $this->language->get('heading_title');
-
 		$this->data['text_error'] = $this->language->get('text_error');
-
 		$this->data['button_continue'] = $this->language->get('button_continue');
+		$this->data['continue'] = $this->url->link('common/home');
 
 		$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
-		$this->data['continue'] = $this->url->link('common/home');
-
 		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 			$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
 		} else {
diff --git a/upload/catalog/controller/information/information.php b/upload/catalog/controller/information/information.php
index e3b52ce..38df1c7 100644
--- a/upload/catalog/controller/information/information.php
+++ b/upload/catalog/controller/information/information.php
@@ -62,14 +62,12 @@ class ControllerInformationInformation extends Controller {
       		);
 
 	  		$this->document->setTitle($this->language->get('text_error'));
-
       		$this->data['heading_title'] = $this->language->get('text_error');
-
       		$this->data['text_error'] = $this->language->get('text_error');
-
       		$this->data['button_continue'] = $this->language->get('button_continue');
-
       		$this->data['continue'] = $this->url->link('common/home');
+      		
+      		$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
 			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 				$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
diff --git a/upload/catalog/controller/product/category.php b/upload/catalog/controller/product/category.php
index f30cb53..4ffea91 100644
--- a/upload/catalog/controller/product/category.php
+++ b/upload/catalog/controller/product/category.php
@@ -379,14 +379,12 @@ class ControllerProductCategory extends Controller {
 			);
 
 			$this->document->setTitle($this->language->get('text_error'));
-
       		$this->data['heading_title'] = $this->language->get('text_error');
-
       		$this->data['text_error'] = $this->language->get('text_error');
-
       		$this->data['button_continue'] = $this->language->get('button_continue');
-
       		$this->data['continue'] = $this->url->link('common/home');
+      		
+      		$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
 			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 				$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
diff --git a/upload/catalog/controller/product/manufacturer.php b/upload/catalog/controller/product/manufacturer.php
index 7dd5359..3ce6a78 100644
--- a/upload/catalog/controller/product/manufacturer.php
+++ b/upload/catalog/controller/product/manufacturer.php
@@ -414,14 +414,12 @@ class ControllerProductManufacturer extends Controller {
 			);
 
 			$this->document->setTitle($this->language->get('text_error'));
-
       		$this->data['heading_title'] = $this->language->get('text_error');
-
       		$this->data['text_error'] = $this->language->get('text_error');
-
       		$this->data['button_continue'] = $this->language->get('button_continue');
-
       		$this->data['continue'] = $this->url->link('common/home');
+      		
+      		$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
 			if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
 				$this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
diff --git a/upload/catalog/controller/product/shoppica.php b/upload/catalog/controller/product/shoppica.php
index cf31414..0eb7eb0 100644
--- a/upload/catalog/controller/product/shoppica.php
+++ b/upload/catalog/controller/product/shoppica.php
@@ -338,6 +338,8 @@ class ControllerProductShoppica extends Controller
         $this->data['button_continue'] = $this->language->get('button_continue');
 
         $this->data['continue'] = HTTP_SERVER . 'index.php?route=common/home';
+        
+        $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 404 Not Found');
 
         if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
             $this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
diff --git a/upload/catalog/model/checkout/order.php b/upload/catalog/model/checkout/order.php
index 8e8d414..afeb625 100644
--- a/upload/catalog/model/checkout/order.php
+++ b/upload/catalog/model/checkout/order.php
@@ -566,4 +566,4 @@ class ModelCheckoutOrder extends Model {
 		}
 	}
 }
-?>
+?>
\ No newline at end of file
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us
Комментариев: 16
  1. Очень нужная статья, но и очень запутанно.

    Администратор поясни по пунктам что как делать?

    Как например при установке обычных модулей opencart!

  2. 2012-06-09 в 23:02:33 | Ruslan Brest

    Поясните, что именно непонятно - может я и пойму, как именно это объяснить понятней.

    Вот пример, где изменения объясняются "нормальными словами", а затем то же самое "формальным" языком в виде Diff-файла: http://rb.labtodo.com/page/uluchshenie-sortirovki-na-vitrine-opencart

    Честное слово, не понимаю, чем diff сложнее, чем в 3-5 раз более длинное и запутанное объяснение словами.

    Вот статья-пояснение о том, что такое Diff: http://rb.labtodo.com/page/help-diff

  3. Блин походу я отстал отстал , а ссылка про diff http://rb.labtodo.com/page/help-diff ещё больше в ступор вогнала! пробую разобраться...

  4. 2012-06-10 в 18:46:16 | Ruslan Brest

    Теперь уже я чего-то не понимаю. Вы в опубликованном дифф-файле имена файлов видите? Плюсики, минусики - их видно? Номера строк для начала поиска?

    С минусами (и красного цвета) - это строки, которые надо найти и убрать. А вместо них поставить то, что с плюсами (зеленого цвета). Что здесь вызывает сложности?

  5. ))))))) да всё вижу и плюсики и минусики, что с этим всем делать никак не пойму!

    Я так понял что это всё делать нужно через командную строку shh?

    Но что дальше, не могу разобраться! Чувствую себя тупым тупым)

    Если есть возможность помогите разобраться, буду премного благодарен!!!

  6. если товар отключен, а внешняя ссылка на него где-то сохранилась, при переходе по ней будет отдан HTTP код 200 (OK) вместо более правильного 404 (Not Found)

    Вкладываем тучу бабла в SEO, крехтим над контентом, фильтруем коменты, и после всего этого, потенциальному покупателю отвечаем:

    - "Пошёл ты дорогой (в прямом смысле) покупатель на 404.

    Ну ты сам прикинь! У тебя палатка на рынке ты по всему городу ходил листовки расклеивал, из рупора объявления кричал, а покупателя даже на порог не пускаеш!

    Ты его чайкофе встречать должен!

    - "Вах, дорогой проходи, садись вкусны сочны арбуз кушай.

    - "Тот тавар, совсем плёхой бил. Чудом последний партия продал.

    - "Вот новый, для себя брал, тебе даром отдам.

    Поисковикам без разницы магазин у Вас или любой другой сайт.

    Страница товара (со всеми SEO приёмами), а потенциально и комментарии, рассматриваются как обычная статья.

    Страница должна жить вечно особенно если её содержание уникально.

    Как реагируют поисковики на 404 от ранее существующей страницы в деталях мне не известно. Но это точно не хорошо для SEO. Ситуацию усугубляет постоянно меняющимся ответ от страницы. Сегодня одни товары выключены завтра другие.

    Если страница попала в поисковик её нельзя прятать.

    По идеи выключеие товара нужно рассматривать как ещё один статус.

    Самый лучший вариант когда на выключенную страницу можно попасть только по прямой (канонической) ссылке (index.php?route=product/product&product;_id=%product_id%). Сама выключенная страница/товар нигде не выводится. В каталоге выгрузках и не учавствует в фильтрах.

    В свою очередь посетителю зашедшему по прямой ссылке нужно полноценно выдать страницу со всем содержимым, но отчётливо дать понять что товара "Нет в наличии, и будет не скоро".

    Можно указать "Товара нет в наличии 2 месяца" считать от даты выключения.

    Ещё лучше если магазин будет готов к это ситуации и предложит покупателю товар максимально близкий к тому что он искал или заменивший этот товар.

    - "Возможно Вам подойдут следующие товары"

    - "Этот товар снят с производства на его замену выпустили новую серию"

  7. Внес все изменения, версия 1.5.1.3 - все равно при скрытой категории сервисы уровня bertal.ru говорят что отдается 200 код... Куда можно копнуть?

  8. 2012-08-07 в 22:27:18 | Ruslan Brest

    Копнуть можно в сторону поиска ошибок. Сервисы уровня apache.org отдают 404, я не могу воспроизвести 200 на отключенной категории. Проверьте, туда ли внесли правки. Есть рядом со строкой с "404" строки с not_found.tpl? Если промазали - значит у вас где-то в другом месте отдается код 404.

  9. 2012-10-27 в 15:26:03 | Владимир

    Везде ответ сервера - 302!!!!! а не 404!

  10. 2012-10-30 в 21:25:22 | Ruslan Brest

    Для начала:

    1. "Везде" - это где?

    2. Какая версия Опенкарт?

  11. Здравствуйте!

    А что это за файл такой?

    catalog/controller/product/shoppica.php

    У меня в OcStore 1513 - такого нет!

    С уважением

    ----

    Я вношу правки вручную.

    Не понял а что в последнем файле менять то:

    @@ -566,4 +566,4 @@ class ModelCheckoutOrder extends Model {
       }
      }
     }
    -?>
    +?>
    \ No newline at end of file

    ?> удалить и тут же добавить ?> что ли?

  12. Я кагбэ - чайник. Я правильно понял, что запись:

    -
             $this->data['heading_title'] = $this->language->get('text_error');

    Значит - что эту строку нужно убрать? Хотя в инструкции написано, что:

    "...Красным ЦВЕТОМ и "-" отмечено, что нужно убрать...", а в этой строке красным только "-" обозначен, а сама строка НЕ КРАСНАЯ.

    И только в

    @@ -22,15 +22,12 @@ class ControllerErrorNotFound extends Controller

    И "-" и строка - красные.

    ----

    Такой вопрос еще. В записи:

    @@ -22,15 +22,12 @@

    22 - это номер строки. А что значат цифры после запятой - 15 и 12?

  13. 2013-03-25 в 04:39:53 | Ruslan Brest
    У меня в OcStore 1513 - такого нет!

    Это для тех, у кого он есть. Вы можете не обращать на эту часть внимания.

    Не понял а что в последнем файле менять
    ?> удалить и тут же добавить ?> что ли?

    Утилита видит все изменения, в т.ч. "невидимые" человеку на первый взгляд. Такие места обычно появляются, если, например, концы строк изменились, пробелы убрались/добавились, ну или текстовый редактор добавил или удалил в конце перевод строки. Вы их здесь не видите, а они были.

    Поэтому просто не обращайте внимания, если строки ничем не отличаются. Я эти файлы создаю автоматически после изменений и не вычищаю подобные места.

  14. 2013-03-25 в 04:48:45 | Ruslan Brest
    Значит - что эту строку нужно убрать? Хотя в инструкции написано, что:

    Нет, неправильно. Минусом и красным цветом там отмечены только несколько пустых строк. Со следующими строками, никак не отмеченными, ничего делать не надо. В инструкции всё правильно написано и цвет не просто так добавлен, а как раз для того, чтобы избежать подобных недоразумений.

    В записи:
    @@ -22,15 +22,12 @@
    22 - это номер строки. А что значат цифры после запятой - 15 и 12?

    Минус и плюс обозначают, к какому из сравниваемых файлов относится запись (минусы - до изменений, плюсы - после изменений).

    22,15 - это диапазон. Начиная с 22 строки, 15 строк.

    После изменений показанный диапазон выглядит как "+22,12" - т.е. начиная с 22 строки, и занимает 12 строк.

    Пользуйтесь гуглом. Я нашёл и прочитал это меньше, чем за пару минут.

  15. Приветствую.

    На opencart 1.5.4.1 пойдет?

  16. 2013-08-09 в 11:10:07 | Ruslan Brest
    На opencart 1.5.4.1 пойдет?

    Должно. Не пробовал.

    Там ничего не менялось, насколько помню.

Оставьте комментарий!

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

Авторизация  Facebook. MaxSiteAuth. Loginza

(обязательно)