Генерация карты сайта в PageBlocks
        Карта сайта (sitemap.xml) помогает поисковым системам быстро находить все страницы вашего сайта. Если страниц очень много, карты можно разбивать на несколько частей: новости, товары, статьи и т.д., а в основной карте давать ссылки на каждую из них. Такой подход облегчает индексирование и ускоряет появление новых страниц в поиске.
Рассмотрим, как создать карту сайта через админку и через роутинг.
Создаём обычную страницу для карты сайта:
Если нет — укажите контексты явно:
1. В основном ресурсе «Sitemap» вызовите pbSitemapIndex вместо pbSitemap:
2. Создайте дочерние ресурсы для каждой группы контента:
Это создаст отдельные карты сайта для каждой группы, а pbSitemapIndex соберет ссылки на них в главной карте.
Если вы используете роутинг в PageBlocks, все делается еще проще и гибче.
1. Меняем метод index, чтобы он выводил индекс карт:
2. Добавляем ещё один роут для конкретных карт:
3. Добавляем метод show для обработки отдельных карт:
Когда у сайта много страниц (сотни, тысячи), одна большая карта может стать неудобной:
     
    
    
                                                        Через админку
Создаём обычную страницу для карты сайта:
- Создайте новый ресурс "Sitemap".
 - В настройках ресурса:
 - Укажите Тип содержимого = XML
 - Снимите галочку "Доступен для поиска" (чтобы сама карта сайта не попала в sitemap).
 - Выберите пустой шаблон (чтобы MODX не добавлял обёртки).
 - В содержимое вставьте сниппет:
 
[[!pbSitemap]]Если нет — укажите контексты явно:
[[!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 в несжатом виде.
 - Разделяя на несколько частей (новости, товары, категории), вы:
 - Ускоряете сканирование страниц поисковыми ботами.
 - Упрощаете сопровождение сайта.
 - Меньше рискуете ошибками индексации.
 
            
                Поблагодарить автора            
            
                 Отправить деньги            
        
        
            
        0