Lorigin

Чтобы не было 404 на отключеный товар

Рекомендуемые сообщения

Lorigin    34

Страницы индексируются, но бывает товар мы выключаем, чтобы ошибки не росли да и человеку было приятней сделал такое решение:

catalogmodelcatalogproduct.php

переписываем функцию getProduct на

public function getProduct($product_id, $status = true) { //$status = true только включенные, $status - не учитывать статус
  if ($this->customer->isLogged()) {
   $customer_group_id = $this->customer->getCustomerGroupId();
  } else {
   $customer_group_id = $this->config->get('config_customer_group_id');
  }

		$r2_status = " AND r2.status = '1'";
		$r1_status = " AND r1.status = '1'";
		$p_status = " AND p.status = '1'";
		if (!$status) {
			$r2_status = '';
			$r1_status = '';
			$p_status = '';
		}
  
  $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer,
  (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount,
  (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special,
  (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward,
  (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status,
  (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class,
  (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class,
  (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id $r1_status GROUP BY r1.product_id) AS rating,
  (SELECT GROUP_CONCAT( p2c2.category_id ) FROM `product_to_category` p2c2 WHERE p2c2.product_id = '".(int)$product_id."' GROUP BY p2c2.product_id) as cats,
  (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id $r2_status GROUP BY r2.product_id) AS reviews,
  p.sort_order
  FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' $p_status AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");

  if ($query->num_rows) {
   $query->row['price'] = ($query->row['discount'] ? $query->row['discount'] : $query->row['price']);
   $query->row['rating'] = (int)$query->row['rating'];
			if ($query->row['cats']) {
				$query->row['cats'] = explode(',',$query->row['cats']);
			} else {
				$query->row['cats'] = array();
			}
   return $query->row;
  } else {
   return false;
  }
}

catalogcontrollerproductproduct.php

$product_info = $this->model_catalog_product->getProduct($product_id);

меняем на

$product_info = $this->model_catalog_product->getProduct($product_id,false);
$this->data['status'] = $product_info['status'];

ну и теперь правим шаблон как вам нужно

catalogviewthemedefaulttemplateproductproduct.tpl

все блоки вывода цены и купить я обернул в <?php if ($status) { ?> <?php } ?>

Ну и в одном else добавил

<div style="text-align:center;color:red;"><b>Нет в наличие</b>, по вопросам приобретения свяжитесь с нами любым способом из раздела <a href="/contact">контакты </a></div>

Пример:

Товар включен: http://menspro.ru/av...omobilnii-nabor

Товар отключен: http://menspro.ru/pr...na-s-nakleikami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость brk   
Гость brk

Хороший костыль.

Может перелинковку на морду будет лучше?

Определённо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
xsobakax    2

вопрос мой близок к заглавию темы:

почему после отключения (и даже удаления товаров) в мастерских Яндекса и Гугла эти страницы продолжают "висеть", и поисковики постоянно указывают мне на ошибки 404.

sitemap регулярно обновляю и подгружаю, я думал на его основании будет воссоздаваться картина всего сайта, а не на считанных роботами данных, которым более 3-6 месяцев.

это проблема opencart, или такая ситуация является естественной?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vitalis    9

вопрос мой близок к заглавию темы:

почему после отключения (и даже удаления товаров) в мастерских Яндекса и Гугла эти страницы продолжают "висеть", и поисковики постоянно указывают мне на ошибки 404.

sitemap регулярно обновляю и подгружаю, я думал на его основании будет воссоздаваться картина всего сайта, а не на считанных роботами данных, которым более 3-6 месяцев.

это проблема opencart, или такая ситуация является естественной?

Бывает висит 6-8 месяцев, исчезнет надо ждать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Lina    3

Хороший костыль.

Может перелинковку на морду будет лучше?

Определённо!

Подскажите, пожалуйста, как сделать перелинковку на морду? благодарю :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
RGB    1 009

А зачем товар отключать, если можно ему влепить статус Нет в наличии?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Esox    20

Чёт не совсем понял, а куда перебрасывыает эта доработка? Была карточка авто набора, а перебрасывает в очки для сна с наклейками. Поясните в чем смысл такого редиректа?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
vitalis    9

А зачем товар отключать, если можно ему влепить статус Нет в наличии?

Можно но если товар снят с производства, клиенты продавца частенько достают, по поводу когда появится и тд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость brk   
Гость brk

Можно но если товар снят с производства, клиенты продавца частенько достают, по поводу когда появится и тд.

Какие проблемы создать статус товара "Нет и не будет в наличии" или производное что-то

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
RGB    1 009

Какие проблемы создать статус товара "Нет и не будет в наличии" или производное что-то

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
traf3d    0

Страницы индексируются, но бывает товар мы выключаем, чтобы ошибки не росли да и человеку было приятней сделал такое решение:

\catalog\model\catalog\product.php

переписываем функцию getProduct на

Пример:

Товар включен: http://menspro.ru/av...omobilnii-nabor

Товар отключен: http://menspro.ru/pr...na-s-nakleikami

 

Спасибо прекрасный способ! Все работает на 1.5.4.1

то что нужно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
freelancer    1 410

вообще-то по правилам status=0 это и есть 404.

если хотите что бы пользователь видел, что товара нет указывайте ему кол-во = 0, а в шаблоне "нет в наличии" вместо кнопки "купить"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Xrumer    4

все четко по инструкции, в итоге получил Parse error: syntax error, unexpected T_IF, expecting T_FUNCTION in

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ssa302    0

Спасибо, все работает.

 

Единственное я не смог вставить код 

<div style="text-align:center;color:red;"><b>Нет в наличие</b>, по вопросам приобретения свяжитесь с нами любым способом из раздела <a href="/contact">контакты </a></div>

 

Подскажите куда его вставлять!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу