Last-Modified для SimplaCMS

Известно что применение 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 любого товара, если все сделано правильно, то будет примерно такая картина.

3 thoughts on “Last-Modified для SimplaCMS”

  1. Здравствуйте, вопрос к автору статьи, можете мне написать на мою почту, есть пару вопросов по поводу интернет магазина! хотел бы у вас проконсультироваться bigsat5@gmail.com

Добавить комментарий

Ваш e-mail не будет опубликован.