Реалізація Turbo-сторінок (Яндекс) для сайту

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація Turbo-сторінок (Яндекс) для сайту
Середня
~2-3 робочих дні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація Яндекс Турбо-сторінок

Яндекс Турбо — аналог Google AMP для російського ринку. Турбо-сторінки генеруються з RSS-ленти спеціального формату та відображаються прямо в пошуку Яндекса на мобільних пристроях. Завантажуються значно швидше оригінальних сторінок завдяки кешуванню на серверах Яндекса.

Формат RSS для Турбо

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:turbo="http://turbo.yandex.ru" version="2.0">
  <channel>
    <title>Назва сайту</title>
    <link>https://example.com</link>
    <description>Опис сайту</description>

    <item turbo="true">
      <title>Заголовок статті</title>
      <link>https://example.com/articles/slug</link>
      <pubDate>Mon, 28 Mar 2025 12:00:00 +0300</pubDate>
      <author>Ім'я автора</author>
      <turbo:topic>Розробка</turbo:topic>

      <turbo:content>
        <![CDATA[
          <header>
            <h1>Заголовок статті</h1>
            <figure>
              <img src="https://example.com/img/cover.jpg" alt="Cover"/>
            </figure>
          </header>

          <p>Введення статті...</p>

          <p>Основний текст з <strong>виділеними</strong> словами та
          <a href="https://example.com/other-article">посиланнями</a>.</p>

          <figure>
            <img src="https://example.com/img/photo.jpg" alt="Фото"/>
            <figcaption>Підпис до фото</figcaption>
          </figure>
        ]]>
      </turbo:content>
    </item>
  </channel>
</rss>

Генерація RSS в Laravel

// TurboFeedController
class TurboFeedController extends Controller
{
    public function __invoke(): Response
    {
        $articles = Article::published()
            ->with(['author', 'category', 'tags'])
            ->latest('published_at')
            ->limit(500)  // Яндекс обробляє до 500 елементів
            ->get();

        $xml = $this->buildFeed($articles);

        return response($xml, 200, [
            'Content-Type' => 'application/rss+xml; charset=utf-8',
        ]);
    }

    private function buildFeed(Collection $articles): string
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->formatOutput = true;

        $rss = $dom->createElement('rss');
        $rss->setAttribute('version', '2.0');
        $rss->setAttribute('xmlns:turbo', 'http://turbo.yandex.ru');
        $dom->appendChild($rss);

        $channel = $dom->createElement('channel');
        $rss->appendChild($channel);

        $this->addElement($dom, $channel, 'title', config('app.name'));
        $this->addElement($dom, $channel, 'link', config('app.url'));
        $this->addElement($dom, $channel, 'description', 'Статті та матеріали');

        foreach ($articles as $article) {
            $item = $dom->createElement('item');
            $item->setAttribute('turbo', 'true');
            $channel->appendChild($item);

            $this->addElement($dom, $item, 'title', $article->title);
            $this->addElement($dom, $item, 'link', route('articles.show', $article));
            $this->addElement($dom, $item, 'pubDate', $article->published_at->toRfc2822String());
            $this->addElement($dom, $item, 'author', $article->author->name);
            $this->addElement($dom, $item, 'turbo:topic', $article->category->name, 'http://turbo.yandex.ru');

            $content = $dom->createElement('turbo:content');
            $content->setAttribute('xmlns:turbo', 'http://turbo.yandex.ru');
            $cdata = $dom->createCDATASection($this->prepareContent($article));
            $content->appendChild($cdata);
            $item->appendChild($content);
        }

        return $dom->saveXML();
    }

    private function prepareContent(Article $article): string
    {
        $content = $article->content;

        // Видаляємо скрипти та небажані теги
        $content = preg_replace('/<script\b[^>]*>.*?<\/script>/is', '', $content);
        $content = preg_replace('/<iframe\b[^>]*>.*?<\/iframe>/is', '', $content);
        $content = preg_replace('/\s*class\s*=\s*["\'][^"\']*["\']/i', '', $content);

        return "<header><h1>{$article->title}</h1></header>{$content}";
    }

    private function addElement(\DOMDocument $dom, \DOMNode $parent, string $tag, string $value, ?string $ns = null): void
    {
        $el = $ns ? $dom->createElementNS($ns, $tag) : $dom->createElement($tag);
        $el->appendChild($dom->createTextNode($value));
        $parent->appendChild($el);
    }
}

Маршрут та кешування

// routes/web.php
Route::get('/turbo-feed.xml', TurboFeedController::class)->name('turbo.feed');

// З кешуванням на 30 хвилин
public function __invoke(): Response
{
    $xml = Cache::remember('turbo_feed', 1800, fn() => $this->buildFeed(/* ... */));
    return response($xml, 200, ['Content-Type' => 'application/rss+xml; charset=utf-8']);
}

Підключення в Яндекс Вебмастері

  1. Додайте сайт в Яндекс Вебмастер
  2. Перейдіть в "Контент" → "Турбо-сторінки"
  3. Вкажіть URL RSS-ленти: https://example.com/turbo-feed.xml
  4. Дочекайтесь індексації (1–3 дні)

Аналітика Турбо-сторінок

Яндекс.Метрика автоматично відслідковує Турбо-трафік як окремий сегмент. У Яндекс Вебмастері доступна статистика переглядів та помилок парсингу.

Терміни

Генерація Турбо-RSS-ленти з кешуванням та інтеграція з Яндекс Вебмастером: 1–2 робочих дні.