Динамический 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)
ВолодянВолодя
17.11.2013 06:25

Каким образом динамически изменять title на аякс страницах? К примеру у тебя на сайте — раздел поиск. Ты там тоже внедрил динамику, но title ведь не меняется при аякс переходах, а только при обновлении страницы.

bezumkinВасилий Наумкин
17.11.2013 06:32

Легко, просто бери и меняй тег title


$('title').text('Мой новый заголовок страницы');

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

Для mSearch2 я только что добавил условие:

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

Вот, погляди как получается.

Поиск «тест» / стр. 4 из 30 / bezumkin.ru

Дмитрий Ломакин
02.01.2014 02:32

не работает. что то с кешированием при переходе по страницам поиска не меняется

bezumkinВасилий Наумкин
02.01.2014 07:02

У меня страницы поиска перелистываются через ajax - там и не будет ничего меняться.

А если перемотать на вторую страницу, и обновить - тогда title будет верный.

Дмитрий Ломакин
02.01.2014 17:05

Понял

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

И еще: когда пользуешься поиском очень востребована информация кто топикстартер, сколько комментариев и кто автор текста найденного, что бы оценить стоит ли читать это. Без этого уже сейчас полезная информация тонет в куче бесполезной, а в перспективе...

bezumkinВасилий Наумкин
02.01.2014 19:25

А ты постоянно заглядываешь в title, чтобы понять на какой странице сейчас находишься? Я вот на него смотрю, только если в закладки добавил.

Но ради интереса набросал скриптик изменения title. Заодно добавил и топикстартера.

Дмитрий Ломакин
02.01.2014 20:32

про "Я вот на него смотрю, только если в закладки добавил." согласен на 100% только если в закладки добавилась стр 4, а по ссылке открывается стр. 7, то начинается взрыв мозга. --------------- "Заодно добавил и топикстартера. " - спасибо, теперь бы еще фильтр по нему, вообще бы песня!

bezumkinВасилий Наумкин
03.01.2014 04:35

Фильтр по нему - это список из 200 - 300 позиций. Толку от такого фильтра нет.

Дмитрий Ломакин
03.01.2014 17:15

Убедил ).

Андрей
14.09.2014 13:19

Василий, вообще-то страницу с результатами поиска принято закрывать от поисковиков в robots.txt А у тебя, гляжу, много "мусорных" страниц и дублей в поисковой выдаче. И тИЦ яндекс обнулил даже. Вот, глянь http://xtool.ru/trast.php?site=bezumkin.ru

DarkLelikАлексей Марченко
18.11.2013 17:56

Очередное спасибо, Василий

Igor Ostancov
02.01.2014 10:36

Я использую 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, взятый из ссылки.

Алексей Карташов
04.01.2014 13:29
// var title = $(this).attr('title');
var title = this.title;

И всё, блеать!

На крайний случай:

var title = this.getAttribute('title');

JS надо не с jquery начинать изучать, чтобы потом jquery-головного_мозга не было.

Sergey
17.09.2014 10:22

Добрый день, Василий! Может включить этот сниппет в pdoToools? Назвать допустим pdoTitle )))

bezumkin
Василий Наумкин
30.06.2022 03:58
Есть ли возможность формировать &quot;friendly URL aliases&quot;, используя аналог translit MODx? ...
bezumkin
Василий Наумкин
27.06.2022 03:32
Спасибо за исправления, очень выручаешь =) Но учитывая количество не описаных в заметке дополнительн...
bezumkin
Василий Наумкин
27.06.2022 03:10
что будет использоваться для вывода многоуровневого меню Посмотри как работают комментарии на этом ...
bezumkin
Василий Наумкин
25.06.2022 11:56
Поправил, спасибо!
bezumkin
Василий Наумкин
22.06.2022 10:08
Я обычно не пользуюсь RTE редакторами, потому что они пишут всякое непонятное что в HTML. Но можно в...
bezumkin
Василий Наумкин
21.06.2022 01:58
onLoad(data) { this.total = data.total }, и onLoad({total}) { this.total = total }, В нашем случ...
bezumkin
Василий Наумкин
20.06.2022 14:01
Прекрасно тебя понимаю, я когда сам в этом разбирался - голова дымилась. Но зато теперь прямо-таки п...
bezumkin
Василий Наумкин
20.06.2022 09:30
Не надо, оно по умолчанию так - я просто чуть более подробно написал.
bezumkin
Василий Наумкин
19.06.2022 13:42
А можно же из 1 файла сделать 2 экспорта. По-умолчанию, и отдельно для футера: export const Footer =...
bezumkin
Василий Наумкин
19.06.2022 09:44
Тебе спасибо, что поддерживаешь рублём мои начинания!