Генерация карты сайта в 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 в несжатом виде.
- Разделяя на несколько частей (новости, товары, категории), вы:
- Ускоряете сканирование страниц поисковыми ботами.
- Упрощаете сопровождение сайта.
- Меньше рискуете ошибками индексации.
Поблагодарить автора
Отправить деньги