Генерация карты сайта в PageBlocks

Карта сайта (sitemap.xml) помогает поисковым системам быстро находить все страницы вашего сайта. Если страниц очень много, карты можно разбивать на несколько частей: новости, товары, статьи и т.д., а в основной карте давать ссылки на каждую из них. Такой подход облегчает индексирование и ускоряет появление новых страниц в поиске.

Рассмотрим, как создать карту сайта через админку и через роутинг.

Через админку


Создаём обычную страницу для карты сайта:
  1. Создайте новый ресурс "Sitemap".
  2. В настройках ресурса:
    • Укажите Тип содержимого = XML
    • Снимите галочку "Доступен для поиска" (чтобы сама карта сайта не попала в sitemap).
    • Выберите пустой шаблон (чтобы MODX не добавлял обёртки).
  3. В содержимое вставьте сниппет:
  4. [[!pbSitemap]]
Если вы используете мультиязычность в PageBlocks, ничего дополнительно делать не нужно: контексты обрабатываются автоматически.

Если нет — укажите контексты явно:
[[!pbSitemap? &context=`web,en,de`]]

Когда карта слишком большая

Если у вас много страниц (новости, товары, статьи), лучше разбить sitemap на части:

1. В основном ресурсе «Sitemap» вызовите pbSitemapIndex вместо pbSitemap:
[[!pbSitemapIndex]]

2. Создайте дочерние ресурсы для каждой группы контента:
  • Например, для новостей:
  • [[!pbSitemap? &parent=`35`]]
Для товаров, категорий и других разделов — аналогично.

Это создаст отдельные карты сайта для каждой группы, а pbSitemapIndex соберет ссылки на них в главной карте.

Пример вывода pbSitemapIndex

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://site.com/sitemap-pages.xml</loc>
  </sitemap>
  <sitemap>
    <loc>https://site.com/sitemap-news.xml</loc>
  </sitemap>
</sitemapindex>

Роутинг для карты сайта


Если вы используете роутинг в PageBlocks, все делается еще проще и гибче.

Шаг 1. Регистрируем роут

В web.php:
use PageBlocks\App\Http\Controllers\SitemapController;

Route::get('/sitemap.xml', [SitemapController::class, 'index']);

Шаг 2. Создаём контроллер SitemapController

<?php
namespace PageBlocks\App\Http\Controllers;

class SitemapController extends Controller
{
    public function index()
    {
        return response($this->modx->runSnippet('pbSitemap'))
            ->header('Content-Type', 'application/xml');
    }
}
Этот метод будет генерировать обычную карту сайта.

Как сделать несколько карт сайтов

Если нужно разбить карту на несколько частей (pages, news, products):

1. Меняем метод index, чтобы он выводил индекс карт:
public function index()
{
    $sitemaps = ['pages', 'news', 'products'];

    $xml = '<?xml version="1.0" encoding="UTF-8"?>';
    $xml .= '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

    foreach ($sitemaps as $alias) {
        $url = MODX_SITE_URL . "sitemap/$alias.xml";
        $xml .= '<sitemap>';
        $xml .= '<loc>' . htmlspecialchars($url) . '</loc>';
        $xml .= '</sitemap>';
    }

    $xml .= '</sitemapindex>';

    return response($xml)
        ->header('Content-Type', 'application/xml');
}

2. Добавляем ещё один роут для конкретных карт:
Route::get('/sitemap/{sitemap}.xml', [SitemapController::class, 'show']);

3. Добавляем метод show для обработки отдельных карт:
public function show(string $sitemap)
{
    $params = [];

    switch ($sitemap) {
        case 'pages':
            $params = ['class_key' => 'modDocument', 'parent' => '-10'];
            break;
        case 'news':
            $params = ['parent' => '10'];
            break;
        case 'products':
            $params = ['class_key' => 'msProduct'];
            break;
        default:
            abort();
    }

    $xml = $this->modx->runSnippet('pbSitemap', $params);

    return response($xml)
        ->header('Content-Type', 'application/xml');
}

Зачем вообще нужен индекс карт (sitemapindex)?


Когда у сайта много страниц (сотни, тысячи), одна большая карта может стать неудобной:

  • У карт сайта есть лимиты: максимум 50 000 URL и 50 MB в несжатом виде.
  • Разделяя на несколько частей (новости, товары, категории), вы:
    • Ускоряете сканирование страниц поисковыми ботами.
    • Упрощаете сопровождение сайта.
    • Меньше рискуете ошибками индексации.
Поисковые системы сами «прочитают» sitemapindex, найдут там ссылки на все карты, и скачивают каждую карту отдельно.
Aleksandr Huz
29 апреля 2025, 16:39
modx.pro
267
+5
Поблагодарить автора Отправить деньги

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0