Динамический title страницы - радуем поисковики

Недавно заметил, что в webmaster.yandex.ru у меня очень много одинаковых заголовков страниц. И если на SEO как таковое мне откровенно начхать, то некрасивый вывод сайта в результатах поиска не радует.

Решил немного поэксперементировать в этом направлении, в результате чего получился довольно простой сниппет.
Что умеет:
  • Если есть longtitle — он используется вместо pagetitle (можно указать другое поле)
  • Затем добавляются родители страницы, используя pdoCrumbs
  • Если на странице есть пагинация — добавляет «стр. n из nn»
  • Результаты работы кэшируются, с учетом параметров url
Дмуаю, вы сможете еще самостоятельно добавить чего-нибудь в этот сниппет.

<?php
// Определяем переменные
if (empty($separator)) {$separator = ' / ';}
if (empty($titlefield)) {$titlefield = 'longtitle';}
if (empty($parents_limit)) {$parents_limit = 3;}
if (empty($tplPages)) {$tplPages = 'стр. [[+page]] из [[+pageCount]]';}

// Ключ и параметры кэширования
$cacheKey = $modx->resource->getCacheKey() . '/title_' . sha1(serialize($_REQUEST));
$cacheOptions = array('cache_key' => 'resource');

if (!$pagetitle = $modx->cacheManager->get($cacheKey, $cacheOptions)) {
	// Узнаём имя страницы
	$pagetitle = !empty($modx->resource->$titlefield)
		? $modx->resource->$titlefield
		: $modx->resource->pagetitle;
	
	// Добавляем поисковый запрос, если есть
	if (!empty($_GET['query']) && strlen($_GET['query']) > 2) {
		// Нужно использовать плейсхолдер, чтобы не подсунули бяку
		$pagetitle .= ' «[[+mse2_query]]»';
	}

	// Добавляем пагинацию, если есть
	if (!empty($_GET['page'])) {
		$pagetitle .= $separator . str_replace('[[+page]]', intval($_GET['page']), $tplPages);
	}
	
	// Добавляем родителей
	$crumbs = $modx->runSnippet('pdoCrumbs', array(
		'to' => $modx->resource->id,
		'limit' => $parents_limit,
		'outputSeparator' => $separator,
		'showHome' => 0,
		'showAtHome' => 0,
		'showCurrent' => 0,
		'direction' => 'rtl',
		'tpl' => '@INLINE [[+menutitle]]',
		'tplCurrent' => '@INLINE [[+menutitle]]',
		'tplWrapper' => '@INLINE [[+output]]',
		'tplMax' => ''
	));
	if (!empty($crumbs)) {
		$pagetitle = $pagetitle . $separator . $crumbs;
	}

	// Кэшируем результаты
	$modx->cacheManager->set($cacheKey, $pagetitle, 0, $cacheOptions);
}

// Возвращаем title
return $pagetitle;

Использовать очень просто — вызываем сниппет в шаблоне страницы:
<title>[[!Title]] / [[++site_name]] - мой самый лучший на свете сайт</title>

Надеюсь, вам понравится моя идея и это не какой-то, всем известный, велосипед.

Следующая заметка
Выбор первых картинок из контента
Предыдущая заметка
Авторизация в админке с фронтенда

Комментарии (14)

  1. Володя 17 ноября 2013, 10:25 # 0
    Каким образом динамически изменять title на аякс страницах? К примеру у тебя на сайте — раздел поиск.
    Ты там тоже внедрил динамику, но title ведь не меняется при аякс переходах, а только при обновлении страницы.
    1. Василий Наумкин 17 ноября 2013, 10:32 # 0
      Легко, просто бери и меняй тег title
      $('title').text('Мой новый заголовок страницы');
      

      Заголовок нужен больше поисковикам, чем людям, поэтому ajax я не заморачиваюсь. Тем более, что при обновлении страницы title будет сгенерирован какой надо.

      Для mSearch2 я только что добавил условие:
      if (!empty($_GET['query']) && strlen($_GET['query']) > 2) {
      	// Нужно использовать плейсхолдер, чтобы не подсунули бяку
      	$pagetitle .= ' «[[+mse2_query]]»';
      }

      Вот, погляди как получается.
      Поиск «тест» / стр. 4 из 30 / bezumkin.ru
      1. Дмитрий Ломакин 02 января 2014, 06:32 # 0
        не работает.
        что то с кешированием
        при переходе по страницам поиска не меняется
        1. Василий Наумкин 02 января 2014, 11:02 # 0
          У меня страницы поиска перелистываются через ajax — там и не будет ничего меняться.

          А если перемотать на вторую страницу, и обновить — тогда title будет верный.
          1. Дмитрий Ломакин 02 января 2014, 21:05 # 0
            Понял

            Хотя с точки зрения удобства пользования вызывает недоумение
            находишься на 17 странице поиска заголовок:
            Поиск «тест» / стр. 4 из 30 / bezumkin.ru
            ИМХО лучше вообще из заголовка номер страницы убрать, оставить:
            Поиск «тест» / 30 стр. / bezumkin.ru

            И еще: когда пользуешься поиском очень востребована информация кто топикстартер, сколько комментариев и кто автор текста найденного, что бы оценить стоит ли читать это. Без этого уже сейчас полезная информация тонет в куче бесполезной, а в перспективе…
            1. Василий Наумкин 02 января 2014, 23:25 # 0
              А ты постоянно заглядываешь в title, чтобы понять на какой странице сейчас находишься? Я вот на него смотрю, только если в закладки добавил.

              Но ради интереса набросал скриптик изменения title. Заодно добавил и топикстартера.
              1. Дмитрий Ломакин 03 января 2014, 00:32 # 0
                про «Я вот на него смотрю, только если в закладки добавил.» согласен на 100%
                только если в закладки добавилась стр 4, а по ссылке открывается стр. 7, то начинается взрыв мозга.
                — «Заодно добавил и топикстартера. » — спасибо, теперь бы еще фильтр по нему, вообще бы песня!
                1. Василий Наумкин 03 января 2014, 08:35 # 0
                  Фильтр по нему — это список из 200 — 300 позиций. Толку от такого фильтра нет.
                  1. Дмитрий Ломакин 03 января 2014, 21:15 # 0
                    Убедил ).
        2. Андрей 14 сентября 2014, 17:19 # 0
          Василий, вообще-то страницу с результатами поиска принято закрывать от поисковиков в robots.txt
          А у тебя, гляжу, много «мусорных» страниц и дублей в поисковой выдаче. И тИЦ яндекс обнулил даже.
          Вот, глянь xtool.ru/trast.php?site=bezumkin.ru
      2. Алексей Марченко 18 ноября 2013, 21:56 # 0
        Очередное спасибо, Василий
        1. Igor Ostancov 02 января 2014, 14:36 # 0
          Я использую History JS для аякс сайтов. Для каждой ссылки меню или любой другой которую собираюсь грузить аяксом я вывожу title целевого ресурса в title ссылки:

          <a href="sozdanie-saytov.html" title="GF - Создание сайтов">Создание сайтов</a>

          При клике на ссылку делаю в js:

          var title = $(this).attr('title');
          History.pushState('...parameters...', title, '...url...');
          

          И соотв. History при переходе на эту страницу подставляет ее title, взятый из ссылки.
          1. Алексей Карташов 04 января 2014, 17:29 # +1
            // var title = $(this).attr('title');
            var title = this.title;
            
            И всё, блеать!

            На крайний случай:
            var title = this.getAttribute('title');
            JS надо не с jquery начинать изучать, чтобы потом jquery-головного_мозга не было.
          2. Sergey 17 сентября 2014, 14:22 # 0
            Добрый день, Василий! Может включить этот сниппет в pdoToools? Назвать допустим pdoTitle )))
            Добавление новых комментариев отключено.