Известно что применение Last-Modified ускоряет поисковую индексацию, т.к. число страниц, бот ПС с сайта за один заход условно говоря ограничено, то передавая боту дату последней модификации страницы можно увеличить краулинговый бюджет.
Т.к. у меня в арсенале имеется сайт с 120000+ продуктов на SimplaCMS, который не совсем хорошо индексируется, я давно хотел внедрить это в движок, однако все найденные мною решения требовали довольно сильной модификации кода, поэтому я решил пойти своим путем, тем более что в SimplaCMS по дефолту есть даже поле с датой создания товара.
Сразу условлюсь, что делать Last-Modified имеет смысл в первую очередь для товаров, т.к. категории и так могут меняться динамично, а уж главная тем более. Правда в таком случае выпадает блог, но о нем как-нибудь потом.
Первым делом сделаем так чтоб колонка с временем создания товара реагировала на любые изменения
ALTER TABLE s_products MODIFY COLUMN created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Это правда немного сломает изначальную логику, например после обновления цены, такие товары будут показываться первыми при сортировке, но с другой стороны, если даже сменили цену товара — то очень бы хотелось чтоб ПС проиндексировал сайт.
Далее укажем что последнее изменение страницы было сегодня (для того чтоб ПС зафиксировал у себя последнюю актуальную версию страницы, вдруг у вас последний раз цена менялась недавно, а в кеше ПС страница не менялась год)
UPDATE `s_products` SET `created`=now();
Далее добавим в главный контроллер View.php, ~23 строка переменную, содержащую время последней модификации страницы
public $last_modified;
и в этом же файле немного ниже в блоке — «Если инстанс класса уже существует — просто используем уже существующие переменные» добавляем
$this->last_modified = &self::$view_instance->last_modified;
А в контроллере отображения товара ProductView.php в самом конце добавим присваивание значения данной переменной
//Передаем дату последней модификации товара в View для реализации Last Modified $this->last_modified = $product->created;
Теперь в корневом index.php, добавим обработку данного значения, которую я честно каюсь почти полностью скопировал с http://forum.simplacms.ru/topic/8113-last-modified/
Заменим
// Если все хорошо if(($res = $view->fetch()) !== false) { // Выводим результат header("Content-type: text/html; charset=UTF-8"); print $res;
на
// Если все хорошо if(($res = $view->fetch()) !== false) { // Выводим результат header("Content-type: text/html; charset=UTF-8"); //Реализация Last Modified, взято http://forum.simplacms.ru/topic/8113-last-modified/ if (isset ($view->last_modified) && $view->last_modified>0) { $LastModified_unix = strtotime($view->last_modified); // время последнего изменения страницы if(!empty($LastModified_unix) && $LastModified_unix > 0) { $LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix); $IfModifiedSince = false; if (isset($_ENV['HTTP_IF_MODIFIED_SINCE'])) $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5)); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5)); if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) { header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified'); } header('Last-Modified: '. $LastModified); } } print $res;
Осталось проверить результат.
Идем на https://last-modified.com/ru/if-modified-since.html и вставляем URL любого товара, если все сделано правильно, то будет примерно такая картина.
Здравствуйте, вопрос к автору статьи, можете мне написать на мою почту, есть пару вопросов по поводу интернет магазина! хотел бы у вас проконсультироваться bigsat5@gmail.com
Не работает 🙁
У меня на трех сайтах все отлично работает, смотрите что Вы делаете не так