Запись sitemap.xml в файл для Opencart 2.x и 3.x
Создаём физический sitemap.xml и снимаем нагрузку с БД

Привет! Решил поделиться с тобой полезным решением для web-движка Opencart 2.x и 3.x. Речь пойдёт о том, как добавить файл sitemap Opencart 2 и Opencart 3.
Данное решение позволяет исключить постоянное обращение поисковых роботов к встроенному в Opencart генератору sitemap, который пересоздаёт карту сайта каждый раз при каждом новом обращении к скрипту (генерирует карту сайта «на лету»), что тем самым очень сильно нагружает web-сервер, на котором стоит сайт, а также позволит генерировать вам две разные карты сайта для Google и Yandex соответственно.
Также подходит для ocStore 2.x, 3.x и других модификаций движка.
Создание и правка файлов
Как добавить файл sitemap Opencart 2 и Opencart 3? Подключись через FTP-клиент к корневой директории твоего сайта и создай в ней файл с расширением *.php и названием sitemap-1JzDeTT, после этого выставь права 0755 на этот файл и открой его в любом удобном для тебятекстовом редакторе (для Windows я рекомендую использовать Notepad++, а для OS X — TextWrangler или Coda).
Файл можно назвать как угодно, но досточно сложно, чтобы исключить прямое обращение к нему третьим лицам.
Затем скопируй и вставь в него следующий код:
Данный кусок кода предназначен для тех людей, у которых установлено два генератора sitemap на сайте: Google Sitemap (стоковый модуль) и Yandex Sitemap в разеделе «Дополнения» > «Каналы продвижения»
Для записи Google Sitemap и Yandex Sitemap в файл под Opencart 2.x
<?php
// Для Opencart 2.x
//Подгружаем конфиг
require_once('config.php');
//Назначаем переменные
//Внимание: HTTPS_SERVER - если вы используете https:// и HTTP_SERVER если http://
$siteMapSource = HTTP_SERVER . 'index.php?route=feed/google_sitemap';
$xml = file_get_contents($siteMapSource);
$siteMapContent = simplexml_load_string($xml);
$siteMapSource2 = HTTP_SERVER . 'index.php?route=feed/yandex_sitemap';
$xml2 = file_get_contents($siteMapSource2);
$siteMapContent2 = simplexml_load_string($xml2);
//Записываем данные из БД в статические файлы *.xml
if (!file_put_contents('1_g_sitemap.xml', $siteMapContent->asXML())) {
error_log(date('Y-m-d H:i:s - ', time()) . 'Unable to save Google content into the file' ."\n", 3, DIR_LOGS . 'sitemap.txt');
die('Google Sitemap data export process has been failed!');
} elseif (!file_put_contents('1_ya_sitemap.xml', $siteMapContent2->asXML())) {
error_log(date('Y-m-d H:i:s - ', time()) . 'Unable to save Yandex content into the file' ."\n", 3, DIR_LOGS . 'sitemap.txt');
die('Yandex Sitemap data export process has been failed!');
} else { echo 'G,YA sitemaps update has been successfully completed!'; }
?>
Для записи Google Sitemap и Yandex Sitemap в файл под Opencart 3.x
<?php
// Для Opencart 3.x
//Подгружаем конфиг
require_once('config.php');
//Назначаем переменные
//Внимание: HTTPS_SERVER - если вы используете https:// и HTTP_SERVER если http://
$siteMapSource = HTTP_SERVER . 'index.php?route=extension/feed/google_sitemap';
$xml = file_get_contents($siteMapSource);
$siteMapContent = simplexml_load_string($xml);
$siteMapSource2 = HTTP_SERVER . 'index.php?route=extension/feed/yandex_sitemap';
$xml2 = file_get_contents($siteMapSource2);
$siteMapContent2 = simplexml_load_string($xml2);
//Записываем данные из БД в статические файлы *.xml
if (!file_put_contents('1_g_sitemap.xml', $siteMapContent->asXML())) {
error_log(date('Y-m-d H:i:s - ', time()) . 'Unable to save Google content into the file' ."\n", 3, DIR_LOGS . 'sitemap.txt');
die('Google Sitemap data export process has been failed!');
} elseif (!file_put_contents('1_ya_sitemap.xml', $siteMapContent2->asXML())) {
error_log(date('Y-m-d H:i:s - ', time()) . 'Unable to save Yandex content into the file' ."\n", 3, DIR_LOGS . 'sitemap.txt');
die('Yandex Sitemap data export process has been failed!');
} else { echo 'G,YA sitemaps update has been successfully completed!'; }
?>
Обрати своё внимание на переменную HTTP_SERVER в коде. Используй её, если твой сайт доступен только по незащищенному протоколу http, либо используй переменную HTTPS_SERVER, если твой сайт доступен только по защищенному протоколу https.
Если у тебя установлен только стоковый модуль генерации карты сайта для Opencart — Google Sitemap, то тебе необходимо скопировать и вставить в созданный файл следующий кусок кода:
Для записи Google Sitemap в файл под Opencart 2.x
<?php
// Для Opencart 2.x
//Подгружаем конфиг
require_once('config.php');
//Назначаем переменные
//Внимание: HTTPS_SERVER - если вы используете https:// и HTTP_SERVER если http://
$siteMapSource = HTTPS_SERVER . 'index.php?route=feed/google_sitemap';
$xml = file_get_contents($siteMapSource);
$siteMapContent = simplexml_load_string($xml);
//Записываем данные из БД в статический файл *.xml
if (!file_put_contents('sitemap.xml', $siteMapContent->asXML())) {
error_log(date('Y-m-d H:i:s - ', time()) . 'Unable to save Google content into the file' ."\n", 3, DIR_LOGS . 'sitemap.txt');
die('Google Sitemap data export process has been failed!');
} else { echo 'Google Sitemap update has been successfully completed!'; }
?>
Для записи Google Sitemap в файл под Opencart 3.x
<?php
// Для Opencart 3.x
//Подгружаем конфиг
require_once('config.php');
//Назначаем переменные
//Внимание: HTTPS_SERVER - если вы используете https:// и HTTP_SERVER если http://
$siteMapSource = HTTPS_SERVER . 'index.php?route=extension/feed/google_sitemap';
$xml = file_get_contents($siteMapSource);
$siteMapContent = simplexml_load_string($xml);
//Записываем данные из БД в статический файл *.xml
if (!file_put_contents('sitemap.xml', $siteMapContent->asXML())) {
error_log(date('Y-m-d H:i:s - ', time()) . 'Unable to save Google content into the file' ."\n", 3, DIR_LOGS . 'sitemap.txt');
die('Google Sitemap data export process has been failed!');
} else { echo 'Google Sitemap update has been successfully completed!'; }
?>
Соответственно, если ты используешь только модуль для Opencart — Yandex Sitemap, тогда тебе потребуется кусок кода, приведенный ниже:
Для записи Yandex Sitemap в файл под Opencart 2.x
<?php
// Для Opencart 2.x
//Подгружаем конфиг
require_once('config.php');
//Назначаем переменные
//Внимание: HTTPS_SERVER - если вы используете https:// и HTTP_SERVER если http://
$siteMapSource = HTTPS_SERVER . 'index.php?route=feed/yandex_sitemap';
$xml = file_get_contents($siteMapSource);
$siteMapContent = simplexml_load_string($xml);
//Записываем данные из БД в статический файл *.xml
if (!file_put_contents('sitemap.xml', $siteMapContent->asXML())) {
error_log(date('Y-m-d H:i:s - ', time()) . 'Unable to save Yandex content into the file' ."\n", 3, DIR_LOGS . 'sitemap.txt');
die('Yandex Sitemap data export process has been failed!');
} else { echo 'Yandex Sitemap update has been successfully completed!'; }
?>
Для записи Yandex Sitemap в файл под Opencart 3.x
<?php
// Для Opencart 3.x
//Подгружаем конфиг
require_once('config.php');
//Назначаем переменные
//Внимание: HTTPS_SERVER - если вы используете https:// и HTTP_SERVER если http://
$siteMapSource = HTTPS_SERVER . 'index.php?route=extension/feed/yandex_sitemap';
$xml = file_get_contents($siteMapSource);
$siteMapContent = simplexml_load_string($xml);
//Записываем данные из БД в статический файл *.xml
if (!file_put_contents('sitemap.xml', $siteMapContent->asXML())) {
error_log(date('Y-m-d H:i:s - ', time()) . 'Unable to save Yandex content into the file' ."\n", 3, DIR_LOGS . 'sitemap.txt');
die('Yandex Sitemap data export process has been failed!');
} else { echo 'Yandex Sitemap update has been successfully completed!'; }
?>
Проверка работоспособности скрипта
После этого сохраняй изменения в файле и закрывай текстовый редактор. Теперь тебе нужно проверить получившийся скрипт на работоспособность.
Для этого тебе необходимо напрямую обратиться к данному файлу через браузер, если всё прошло без ошибок, то ты увидишь сообщение об успешной генерации статических файлов sitemap в своём браузере:

Также в корневой директории твоего сайта, рядом с файлом sitemap-1JzDeTT.php появятся новые файлы: для первого случая — 1_g_sitemap.xml и 1_ya_sitemap.xml, а для остальных — sitemap.xml

Добавляем задание в планировщик CRON
Для того, чтобы карта сайта обновлялась автоматически, тебе необходимо добавить задание в планировщик CRON на хостинге, предварительно установив пакет wget для Linux.
Далее ты можешь добавить команду через GUI-панель управления хостинга
/usr/bin/wget -O - -q -t 1 'http://site.ru/sitemap-1JzDeTT.php' > /dev/null 2>&1
Где site.ru — домен твоего сайта.
или, если у тебя есть доступ к файловой системе web-сервера (VPS, VDS), тогда ты можешь напрямую отредактировать файл crontab через SSH или sFTP:
vi /etc/crontab
или
nano /etc/crontab
и перед символом # добавить:
30 3 * * * root /usr/bin/wget -O - -q -t 1 'http://site.ru/sitemap-1JzDeTT.php' > /dev/null 2>&1
Где site.ru — домен твоего сайта.
Сохранить и закрыть текстовый редактор в терминале.
Вывод
Теперь каждый день в 03:30 твоя карта сайта будет автоматически обновляться в файл, соответственно поисковым роботам ты указываешь путь к физическому файлу — /1_ya_sitemap.xml или 1_g_sitemap.xml, а не к динамическому — /index.php?route=feed/google_sitemap или /index.php?route=extension/feed/google_sitemap в Opencart 3.
Таким образом, генерация карты твоего сайта «на лету» будет происходить один раз в сутки по расписанию, а роботы будут «терзать» статический файлик, не нагружая при этом сервак.
Чтобы сделать «умный» файл robots.txt, который будет отдавать поисковому боту Яндекса (и ему подобным) файл sitemap.xml с упрощенной разметкой, а поисковому роботу от Google — sitemap.xml, который включает в себя изображения товаров, рекомендую тебе изучить эту статью: Создаём умный robots.txt на PHP.
Удачных доработок и до связи!