Запись sitemap.xml в файл для Opencart 2.x и 3.x

Создаём физический sitemap.xml и снимаем нагрузку с БД

Запись sitemap.xml в файл для Opencart 2.x и 3.x

Привет! Решил поделиться с тобой полезным решением для 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!'; } 

?>

Скачать файл для Yandex и Google под Opencart 2.x

Для записи 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!'; } 

?>

Скачать файл для Yandex и Google под Opencart 3.x

Обрати своё внимание на переменную 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 под Opencart 2.x

Для записи 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!'; } 

?>

Скачать файл для Google под Opencart 3.x

Соответственно, если ты используешь только модуль для 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 под Opencart 2.x

Для записи 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!'; } 

?>

Скачать файл для Yandex под Opencart 3.x

Проверка работоспособности скрипта

После этого сохраняй изменения в файле и закрывай текстовый редактор. Теперь тебе нужно проверить получившийся скрипт на работоспособность.

Для этого тебе необходимо напрямую обратиться к данному файлу через браузер, если всё прошло без ошибок, то ты увидишь сообщение об успешной генерации статических файлов sitemap в своём браузере:

Запись sitemap.xml в файл для Opencart 2.X
Пример вывода об успешной генерации sitemap для Google и Yandex

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

Запись sitemap.xml в файл для Opencart 2.X
Для первого случая — 1_g_sitemap.xml и 1_ya_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.

Удачных доработок и до связи!

Плюсануть
Поделиться
Отправить
Запинить
Понравился этот пост? Поделись им в соцсети!
Популярное
75 комментариев
Алекс
Алекс

6 декабря 2017, 18:47

В robots.txt какой путь прописывать на карту сайта для Яндекса и Гугла?

Александр Окатьев

Здравствуйте, Алекс!

Рекомендую вам ознакомиться с этой статьей: https://okatiev.ru/all/sozdayom-umny-robots-txt-na-php/, она поможет вам организовать гибкий robots.txt, в котором вы сможете прописать несколько sitemap’ов под разные поисковики (Google, Yandex) бесконфликтным образом для каждого из них, то есть ЯндексБот будет видеть свою карту сайта, а ГуглБот — свою. Успешных доработок!

До связи!

Алекс
Алекс

7 декабря 2017, 10:03

По ссылке станица не найдена.

Александр Окатьев

Ссылку поправил, запятая интерпретировалась как часть ссылки.

Алекс
Алекс

7 декабря 2017, 12:12

Спасибо. Нашел. Написал комментарий на странице.

Семен Ивасишин
Семен Ивасишин

12 января 2018, 11:51

А вы не подскажите как делать в ОпенКарт версии 3.x Так же, или что то надо менять?

Александр Окатьев

Здравствуйте! Скорее всего для Opencart 3.х нужно будет производить определенные доработки или использовать иной метод, так как семейство движков отличается.

Семен Ивасишин
Семен Ивасишин

12 января 2018, 12:01

У меня opencart-3.0.2.0-rs загрузил ваш файл запустил его выдал вот это:
Warning: file_get_contents(http://po300.ru/index.php?route=feed/google_sitemap): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/yifrfcdk/po300.ru/sitemap-1JzDeTT.php on line 9

Warning: file_get_contents(http://po300.ru/index.php?route=feed/yandex_sitemap): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/yifrfcdk/po300.ru/sitemap-1JzDeTT.php on line 13

Fatal error: Uncaught Error: Call to a member function asXML() on boolean in /home/yifrfcdk/po300.ru/sitemap-1JzDeTT.php:17 Stack trace: #0 {main} thrown in /home/yifrfcdk/po300.ru/sitemap-1JzDeTT.php on line 17

Александр Окатьев

При доступе к адресу http://po300.ru/index.php?route=feed/google_sitemap — сайт отдаёт ошибку 404, то есть сообщает нам, что такой страницы не существует.

У вас включен модуль Google Sitemap в админке?

Семен Ивасишин
Семен Ивасишин

13 января 2018, 12:55

А как же без него? Включен

Семен Ивасишин
Семен Ивасишин

13 января 2018, 12:58

О! стоп. перепутал... нет не включен и нет его вооюще

Александр Окатьев

Вам нужно его поставить, а также поставить Yandex Sitemap для Opencart, а лишь затем использовать данную доработку.

Семен Ивасишин
Семен Ивасишин

13 января 2018, 13:13

Уже ставлю... только яндекс нашел бесплатный для версии 3

Семен Ивасишин
Семен Ивасишин

13 января 2018, 13:19

Поставил, но есть ещё Google Base это что?

Александр Окатьев

Google Base можете проигнорировать, вам нужен Google Sitemap.

Семен Ивасишин
Семен Ивасишин

13 января 2018, 13:22

Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0

Вот что теперь выдал: Fatal error: Unknown: Failed opening required ’/home/yifrfcdk/po300.ru/sitemap-1JzDeTT.php’ (include_path=’.:/opt/alt/php70/usr/share/pear’) in Unknown on line 0

Александр Окатьев

В Opencart 3 используется немного другой URL, я сейчас подправлю модуль для вас.

Семен Ивасишин
Семен Ивасишин

13 января 2018, 13:26

А в корень сайта только этот файл надо загружать sitemap-1JzDeTT.php без вот этого: .DS_Store

Александр Окатьев

Файл .DS_store можете удалить.

Семен Ивасишин
Семен Ивасишин

13 января 2018, 13:29

Ну я его и не грузил... просто спросил... Ну в общем пока карту не создал...
Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0

Fatal error: Unknown: Failed opening required ’/home/yifrfcdk/po300.ru/sitemap-1JzDeTT.php’ (include_path=’.:/opt/alt/php70/usr/share/pear’) in Unknown on line 0

Александр Окатьев

Дополнил данную статью, можете ознакомиться. Вам необходимо изменить строку в файле sitemap-1JzDeTT.php:

$siteMapSource = HTTP_SERVER . 'index.php?route=feed/google_sitemap';

на

$siteMapSource = HTTP_SERVER . 'index.php?route=extension/feed/google_sitemap';

и строку:

$siteMapSource2 = HTTP_SERVER . 'index.php?route=feed/yandex_sitemap';

на

$siteMapSource2 = HTTP_SERVER . 'index.php?route=extension/feed/yandex_sitemap';
Семен Ивасишин
Семен Ивасишин

13 января 2018, 13:54

Ща попробую...

Семен Ивасишин
Семен Ивасишин

13 января 2018, 14:05

G,YA sitemaps update has been successfully completed!

Семен Ивасишин
Семен Ивасишин

13 января 2018, 14:07

1_g_sitemap.xml
и
1_ya_sitemap.xml
Созданы... Вах Вах спасибо на версии 3

Александр Окатьев

Отлично :)
Всегда рад помочь!

Семен Ивасишин
Семен Ивасишин

13 января 2018, 14:09

Буду дальше дерзать надо теперь крон подключить читал статью как то неуверенно себя чувствую после прочтенного. Но попробую.... А скажите как обновлять карту в ручную? Пока крон не подключен...

Александр Окатьев

В браузере набираете http://вашсайт.ru/sitemap-1JzDeTT.php и переходите по ссылке, затем видите сообщение об успешном обновлении файлов «G,YA sitemaps update has been successfully completed!».

Всё, sitemap-файлы обновлены!

Семен Ивасишин
Семен Ивасишин

13 января 2018, 14:15

Вот набрал с браузера адрес http://po300.ru/1_ya_sitemap.xml а он пишет не нашел такую страницу это почему?

Александр Окатьев

В корне сайта есть файлы 1_ya_sitemap.xml и 1_g_sitemap.xml? Если нет, то создайте такие файлы вручную и выставьте на них права 755 или 777.

Семен Ивасишин
Семен Ивасишин

13 января 2018, 14:21

Веб Мастер яндекса на проверке адреса http://po300.ru/1_ya_sitemap.xml то же пишет : Ошибка

Семен Ивасишин
Семен Ивасишин

13 января 2018, 14:29

Не помогло и 777 и 755 все равно не открывает Может у меня что то в .htaccess что не позволяет открывать их?

Александр Окатьев

Откройте эти файлы блокнотом, там есть содержимое в них?

Семен Ивасишин
Семен Ивасишин

13 января 2018, 14:30

AddDefaultCharset UTF-8

Options -Indexes

<FilesMatch «\.(tpl|ini|log)»>
Order deny,allow
Deny from all
</FilesMatch>

<FilesMatch «error.(txt)$»>
Order Allow,Deny
Deny from all
</FilesMatch>

<Files .htaccess>
order allow,deny
deny from all
</Files>

RewriteCond %{HTTP_HOST} ^www.po300.ru$ [NC]
RewriteRule ^(.*)$ http://po300.ru/$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\ HTTP/
RewriteRule ^index\.html$ / [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ / [R=301,L]
RewriteCond %{QUERY_STRING} ^route=common/home$
RewriteCond %{REQUEST_METHOD} !^POST$
RewriteRule ^index\.php$ http://%{HTTP_HOST}? [R=301,L]

RewriteCond %{QUERY_STRING} ^qwerty\d+
RewriteRule ^$ /? [R=301,L]

RewriteBase /
RewriteCond %{QUERY_STRING} ^page=1$
RewriteRule (.*) $1? [R=301,L]

RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^hotline.xml$ /system/download/hotline.xml [L]
RewriteRule ^yandex.xml$ /system/download/yandex.xml [L]
RewriteRule ^market_yandex_ua.xml$ /system/download/market_yandex_ua.xml [L]
RewriteRule ^freemarket_kiev_ua.xml$ /system/download/freemarket_kiev_ua.xml [L]
RewriteRule ^price_ua.xml$ /system/download/price_ua.xml [L]
RewriteRule ^metamarket_com_ua.xml$ /system/download/metamarket_com_ua.xml [L]
RewriteRule ^ava_ua.xml$ /system/download/ava_ua.xml [L]
RewriteRule ^hotprice_ua.xml$ /system/download/hotprice_ua.xml [L]
RewriteRule ^technoportal_ua.xml$ /system/download/technoportal_ua.xml [L]
RewriteRule ^mircen_com_ua.xml$ /system/download/mircen_com_ua.xml [L]
RewriteRule ^vseceni_kiev_ua.xml$ /system/download/vseceni_kiev_ua.xml [L]
RewriteRule ^qp_ua.xml$ /system/download/qp_ua.xml [L]
RewriteRule ^np_ua.xml$ /system/download/np_ua.xml [L]
RewriteRule ^ukrshops_com_ua.xml$ /system/download/ukrshops_com_ua.xml [L]
RewriteRule ^nadavi_net.xml$ /system/download/nadavi_net.xml [L]
RewriteRule ^spravka_ua.xml$ /system/download/spravka_ua.xml [L]
RewriteRule ^i_m_com_ua.xml$ /system/download/i_m_com_ua.xml [L]
RewriteRule ^google_sitemap$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteRule ^yandex_market$ index.php?route=feed/yandex_market [L]
RewriteRule ^download/(.*) /index.php?route=error/not_found [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

RewriteRule sitemap.xml /index.php?route=feed/google_sitemap
RewriteRule google_sitemap /index.php?route=feed/google_sitemap
RewriteRule ^(contact)$ index.php?route=information/$1
RewriteRule ^(account/return/insert)$ index.php?route=$1
RewriteCond %{QUERY_STRING} ^route=common/home$

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\ HTTP/
RewriteRule ^index\.html$ / [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ / [R=301,L]
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^index\.php$ / [R=301]

Options +SymLinksIfOwnerMatch

#php_flag register_globals off
#php_flag magic_quotes_gpc Off
#php_value upload_max_filesize 999M
#php_value post_max_size 999M
#php_value max_execution_time 20000
#php_value max_input_time 20000
#php_admin_value open_basedir none

<ifModule mod_headers.c>
Header set Connection keep-alive
</ifModule>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
<ifModule mod_headers.c>
Header append Vary User-Agent
</ifModule>

Александр Окатьев

У вас не работает ModRewrite.

Перед строкой

RewriteCond %{HTTP_HOST} ^www.po300.ru$ [NC]

добавьте строку

RewriteEngine On

Также удалите строки:

RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule google_sitemap /index.php?route=feed/google_sitemap
Семен Ивасишин
Семен Ивасишин

13 января 2018, 14:33

Записи есть не пустой Вот это от гугл мар (сократил текст) :

<?xml version=«1.0» encoding=«UTF-8»?>
<urlset xmlns=«http://www.sitemaps.org/schemas/sitemap/0.9» xmlns:image=«http://www.google.com/schemas/sitemap-image/1.1»><url> <loc>http://po300.ru/premium-aloe-soothing-gel</loc> <changefreq>weekly</changefreq> <lastmod>2018-01-09T01:37:11+00:00</lastmod> <priority>1.0</priority> <image:image> <image:loc>http://po300.ru/image/cache/catalog/demo/MISSHAPremiumAloeSoothingGel-400x490-</url><url> <loc>http://po300.ru/terms</loc> <changefreq>weekly</changefreq> <priority>0.5</priority></url><url> <loc>http://po300.ru/missha-istoriya-brenda</loc> <changefreq>weekly</changefreq> <priority>0.5</priority></url></urlset>

Семен Ивасишин
Семен Ивасишин

13 января 2018, 15:08

Поправил в .htaccess но все по прежнему... не открывает страницы карты говорит не нашел страницу...

Александр Окатьев

У вас что-то странное происходит с ЧПУ. Ни одна ссылка из .htaccess не интерпретируется. Напишите в поддержку хостинга, с вопросом о том, что не работает .htaccess. Что они ответят?

Семен Ивасишин
Семен Ивасишин

13 января 2018, 15:19

Хорошо... попробую

Александр Окатьев

Где-то, что-то в настройках Web-сервера не верно указано.

Семен Ивасишин
Семен Ивасишин

13 января 2018, 15:23

Я правда не понял о чем конкретно их спросить что бы они поняли что хочу от них?

Семен Ивасишин
Семен Ивасишин

13 января 2018, 16:20

Я определил что это не хостинг это какая то запись в в .htaccess попробую отыскать её...

Семен Ивасишин
Семен Ивасишин

13 января 2018, 17:17

Вот, нашел строку в .htaccess, которая не давала выводить карту:
RewriteRule sitemap.xml /index.php?route=feed/google_sitemap

Семен Ивасишин
Семен Ивасишин

13 января 2018, 17:25

Все работает очень благодарен вам ваши статьи действительно хороши.
Вот буду думать как не дать выводить в карту сайта картинки и другие не нужные ссылки?
У вас нет решений которые могут управлять процессом выключения ссылок из карты по усмотрению админа?

Александр Окатьев

http://po300.ru/1_ya_sitemap.xml — необходимо указывать Яндексу (без ссылок на изображения)
http://po300.ru/1_g_sitemap.xml — необходимо указывать Гуглу (со ссылками на изображения)

Изучите эту статью: https://okatiev.ru/all/sozdayom-umny-robots-txt-na-php/

Семен Ивасишин
Семен Ивасишин

13 января 2018, 17:37

Вот, Яндексу не понравился файл Карты:
Валидатор XML-фидов
Результаты проверки:
XML-файл не соответствует схеме.
Строка: -1 Позиция: -1
Подробнее
<detail>Premature end of file.</detail>

Семен Ивасишин
Семен Ивасишин

13 января 2018, 17:40

Не найдено описание для элемента «urlset». Возможно неверно указан корневой элемент.
Строка: 2 Позиция: 61
Подробнее
cvc-elt.1.a: Cannot find the declaration of element ’urlset’.

Семен Ивасишин
Семен Ивасишин

13 января 2018, 17:51

А вот, Анализ файлов Sitemap
Результаты анализа «http://po300.ru/1_ya_sitemap.xml»

Тип файла Файл Sitemap
Размер 4,29 КБ
Количество ссылок 31
Ошибок не найдено


Валидатор XML-фидов
Результаты проверки:
Результаты проверки
Не найдено описание для элемента «urlset». Возможно неверно указан корневой элемент.
Строка: 2 Позиция: 61
Подробнее
<detail>cvc-elt.1.a: Cannot find the declaration of element ’urlset’.</detail>

Александр Окатьев

Всё верно! Это две одинаковые карты сайта, но оформленные под разные поисковые системы: Yandex и Google.

Каждой из них нужно указать свой sitemap, а не два одновременно.

Семен Ивасишин
Семен Ивасишин

13 января 2018, 18:56

Указывал одну по тесту только яндекса...
получается он сам вычисляет наличие второй карты? Странно ведь имя там неканоническое...

Александр Окатьев

Карту сайта для Яндекса проверяйте валидатором в Яндекс.Вебмастере, а карту сайта для Google — в Google Console. Не используйте сторонние анализаторы.

Михаил
Михаил

13 января 2018, 22:50

50к товаров уже не срабатывает. Сколько памяти нужно php выделить на выполнение? Можете рекомендации по php.ini дать. Как генерировать несколько sitemap что бы обойти ограничение в 50к и 10Mb.

Александр Окатьев

В каком смысле не срабатывает? Какую ошибку при этом выдаёт web-сервер?

Михаил
Михаил

13 января 2018, 23:28

500 ошибка в браузере, в логах PHP Fatal error: Call to a member function asXML(); и

Александр Окатьев

Попробуйте такие значения для php.ini:

max_execution_time = 180
max_input_time = 120
max_input_vars = 1000000
memory_limit = 1024M
default_socket_timeout = 90

и для apache2.conf

Timeout 600
KeepAlive On
MaxKeepAliveRequests 4096
KeepAliveTimeout 120

Будет здорово, если вы скопируете ошибку целиком из файла логов.

Михаил
Михаил

14 января 2018, 00:06

PHP Fatal error: Call to a member function asXML() on boolean in /home/пользователь/web/адрес_сайта/public_html/sitemap-1JzDeTT.php on line 13

Александр Окатьев

Какая версия движка у вас, какого хостинг-провайдера используете и какая версия php на сервере? Ошибка сразу же появляется при обращении к скрипту или спустя некоторое время, после ожидания?

Михаил
Михаил

14 января 2018, 00:25

Ver. 3.0.2.1b, у меня VPS на РЕГ.РУ, php 5.6. Долго грузит и в итоге падает. Но googlesitemap и из коробки не работал, так же падало. Yandex-sitemap срабатывает.

Александр Окатьев

Вы используете версию файла из статьи для OC 3.x?
Если google_sitemap укладывал web-сервер из коробки, то он и продолжает это успешно делать. Попробуйте внести изменения в php.ini и в apache2.conf, затем перезапустите apache2 на VPS-ке и проверьте обращение к скрипту.
К слову, узким местом может быть конфиг MySQL, но сперва проверьте генерацию с использованием новых значений.

Михаил
Михаил

14 января 2018, 02:08

Нет не тянет всё равно. Я вчера пробовал yandex-sitemap, создаёт за минуту, но 133К ссылок в sitemap, я так понимаю это у меня дубли, товаров всего 44К, получается 44К ЧПУ адресов + категории + ЧПУ + производители + ЧПУ как раз получается 133К, как вырубить категории и производителей, чисто что бы прямые ЧПУ ссылки на товары остались?

Михаил
Михаил

14 января 2018, 02:49

Заработало. Выпилил категории, производители, оставил только товары. Спасибо за скрипт!

Александр Окатьев

Карта под Google генерится?

Михаил
Михаил

14 января 2018, 16:32

Да, генерится, но я выпилил код связанный с картинками, производителями и категориями. Cron тоже отрабатывает. Большое спасибо!

Александр Окатьев

Тогда можете использовать для Google ту карту сайта, которая генерируется для Яндекса, если вы выпилили изображения из Гугловой. Толку в ней не будет, в таком случае, только лишняя нагрузка) Обращайтесь, всегда рад помочь!

Семен Ивасишин
Семен Ивасишин

14 января 2018, 16:35

Михаил, и как пилить этот код связанный с картинками, производителями, категориями и где?

Михаил
Михаил

14 января 2018, 16:38

catalog\controller\extension\feed\google_sitemap.php

<?php
class ControllerExtensionFeedGoogleSitemap extends Controller {
public function index() {
if ($this->config->get(’feed_google_sitemap_status’)) {
$output = ’<?xml version=«1.0» encoding=«UTF-8»?>’;
$output .= ’<urlset xmlns=«http://www.sitemaps.org/schemas/sitemap/0.9»>’;

$this->load->model(’catalog/product’);

$products = $this->model_catalog_product->getProducts();

foreach ($products as $product) {
if ($product[’image’]) {
$output .= ’<url>’;
$output .= ’ <loc>’ . $this->url->link(’product/product’, ’product_id=’ . $product[’product_id’]) . ’</loc>’;
$output .= ’ <changefreq>weekly</changefreq>’;
$output .= ’ <lastmod>’ . date(’Y-m-d\TH:i:sP’, strtotime($product[’date_modified’])) . ’</lastmod>’;
$output .= ’ <priority>1.0</priority>’;
$output .= ’</url>’;
}
}

$this->load->model(’catalog/information’);

$informations = $this->model_catalog_information->getInformations();

foreach ($informations as $information) {
$output .= ’<url>’;
$output .= ’ <loc>’ . $this->url->link(’information/information’, ’information_id=’ . $information[’information_id’]) . ’</loc>’;
$output .= ’ <changefreq>weekly</changefreq>’;
$output .= ’ <priority>0.5</priority>’;
$output .= ’</url>’;
}

$output .= ’</urlset>’;

$this->response->addHeader(’Content-Type: application/xml’);
$this->response->setOutput($output);
}
}
}

Семен Ивасишин
Семен Ивасишин

14 января 2018, 16:50

Это вырезать из файла гугла а с яндексом что делать?

Михаил
Михаил

14 января 2018, 17:03

Я не программист, но как понимаю без обработки картинок googlesitemap и yandexsitemap становятся взаимозаменяемыми, карта проходит проверку валидатором гугла и яши. Считается что модуль yandexsitemap меньше базу нагружает, но меня устраивает, cron задание стоит на 3 утра и в момент генерации карты сервер не падает и посетителей в это время нет, то бишь нагрузки.

Михаил
Михаил

14 января 2018, 17:04

Семён это не вырезать, это оставить) вот ссылка на получившийся контроллер https://yadi.sk/d/G4QIcNNx3RSXwi

Семен Ивасишин
Семен Ивасишин

14 января 2018, 17:06

Во... а то я примеряюсь уже это вырезать из файла :)))) Во время сказали...

Семен Ивасишин
Семен Ивасишин

14 января 2018, 17:09

Скачал а у меня опенкарт 3 это ничего там разницы не будет в кодах?
Ваще Александр писал что можно оставить одну карту вот думаю как это сделать и что бы имя её генерировалось просто sitemap.xml

Александр Окатьев

Используйте версию скрипта для генерации одного физического файла под Яндекс (без картинок). Сгенерированный файл будет называться sitemap.xml.

<?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!'; } 

?>

Или скачайте файл по ссылке: https://okatiev.ru/files/zip/sitemap-for-yandex-oc3.zip

Семен Ивасишин
Семен Ивасишин

14 января 2018, 17:18

Благо-Дарю Александр +++

Александр Окатьев

Во благо :)

Семен Ивасишин
Семен Ивасишин

14 января 2018, 17:24

А как быть с контроллером яндекс теперь?
Отключить его?

Семен Ивасишин
Семен Ивасишин

14 января 2018, 17:26

Вах запутался гугл получается отключить а этот код михаила как он вырезал его в гугле

Семен Ивасишин
Семен Ивасишин

14 января 2018, 17:30

Сгенерилась правильная карта !!! Ура... и по моему там нет картинок... ща проверю...

Семен Ивасишин
Семен Ивасишин

14 января 2018, 17:32

Проверил нет ни одной картинки только правильные ссылки на страницы и это гуд!

Александр Окатьев

Модуль Google Sitemap отключите, оставьте только Yandex Sitemap, в Google Console и Яндекс Вебмастере указывайте один sitemap, который генерирует Яндексовый модуль.

Семен Ивасишин
Семен Ивасишин

14 января 2018, 18:10

а убрать ссылки на производителей и категории здесь: catalog\controller\extension\feed\yandex_sitemap.php такой же код оставить как у Михаила в гугловском файле?

Александр Окатьев

Нужно смотреть. Если файлы идентичные, то можно скопировать, если нет — сделать по аналогии.

Мария
Мария

21 января 2018, 15:51

Добрый день!
У меня похожая проблема: 500 ошибка в браузере, в логах PHP Fatal error: Call to a member function asXML(); Верисия движка OS 23023

Александр Окатьев

Модули Google Sitemap и Yandex Sitemap установлены и активны у вас на сайте?

Мария
Мария

22 января 2018, 00:04

Да, активны

Александр Окатьев

Будьте добры, скопируйте ошибку из логов целиком.

Мария
Мария

22 января 2018, 13:45

[21-Jan-2018 15:43:24 Europe/Moscow] PHP Warning: file_get_contents(https://krim-parfyum.ru/index.php?route=feed/google_sitemap): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in /home2/bukvor/public_html/krim-parfyum.ru/sitemap-7JzDeTT.php on line 9
[21-Jan-2018 15:43:28 Europe/Moscow] PHP Warning: file_get_contents(https://krim-parfyum.ru/index.php?route=feed/yandex_sitemap): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in /home2/bukvor/public_html/krim-parfyum.ru/sitemap-7JzDeTT.php on line 13
[21-Jan-2018 15:43:28 Europe/Moscow] PHP Fatal error: Call to a member function asXML() on a non-object in /home2/bukvor/public_html/krim-parfyum.ru/sitemap-7JzDeTT.php on line 17
А сегодня, после вчерашних экспериментов, пошли подряд ошибки по базе данных. Не могу ничего понять, и это пугает...)

Мария
Мария

24 января 2018, 13:39

Добрый день! Простите, комментариев не будет?)

Александр Окатьев

Здравствуйте, Мария!

Используйте этот код, должно сработать:

<?php

//Подгружаем конфиг
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!'; } 

?>
Мария
Мария

26 января 2018, 18:54

Спасибо!!! Все сгенерировалось!

Мария
Мария

28 января 2018, 14:40

Добрый день! Скажите, пожалуйста, а как проверить корректность работы всей этой истории? Файлы с картой сайта есть в корневой директории, обновляются ночью. В Вебмастере я их проверила. А при обращении напрямую к site.ru/sitemap.xml открывается не они — статические, а динамический файл index.php?route=extension/feed/google_sitemap. Это разве правильно?
Возможно, еще нужна какая-то правка в ..htaccess ?

Мария
Мария

29 января 2018, 13:27

И еще вопрос. Вместе с файлами 1_g_sitemap.xml и 1_ya_sitemap.xml дружно генерируется файл yandex_sitemap.xml. Первый раз, когда я это обнаружила, я его удалили, но он генерируется каждый раз вместе со всей компанией...
Да, робот у меня по вашей схеме — robots-xYz01Q.php и там прописаны все адреса карт сайта... И Гугл и Яндекс его видят корректно

Александр Окатьев

Ещё актуально?

Андрей
Андрей

7 марта 2018, 06:43

ПОдскажите, в php 5.4 работает, а в 5.6 ошибка: file_get_contents(http://kidzlandia.ru/index.php?route=extension/feed/yandex_sitemap): failed to open stream: HTTP request failed!

Что можно исправить?

Александр Окатьев

Посмотрите, разрешена ли функция allow_url_fopen в php.ini

Андрей
Андрей

7 марта 2018, 21:39

Directive Local Value Master Value
allow_url_fopen On On

Мария
Мария

7 марта 2018, 23:03

Добрый вечер!
Актуален вопрос, про в .htacces, повторю его: «Файлы с картой сайта теперь есть в корневой директории, обновляются ночью. В Вебмастере я их проверила. А при обращении напрямую к site.ru/sitemap.xml открывается не они — статические, а динамический файл index.php?route=extension/feed/google_sitemap. Это разве правильно? Возможно, еще нужна какая-то правка в ..htaccess ?»
И сообще, — как грамотно сделать запрет на обращение к штатному динамическому файлу?
Спасибо

Александр Окатьев

Файлы sitemap, которые сгенерировались у Вас скриптом называются 1_g_sitemap.xml для Гугла и 1_ya_sitemap.xml для Яндекса. То есть обращаться Вам и ботам нужно к этим файлам через адресную строку. Обращаться к файлу sitemap.xml не нужно.

В .htaccess Вам нужно закомментировать строку

RewriteRule ^sitemap\.xml$ /index.php?route=feed/google_sitemap [L]
Antonina
Antonina

19 марта 2018, 03:12

доброй ночи.
делаю новый сайт и, вдохновившись вашей статьей, делаю все по порядку.
ОС Version 3.0.1.2 (rs.1)
модули Google Sitemap и Yandex Sitemap включены
при включении Yandex Sitemap вышла ошибка (но модуль включился):
Warning: Cannot modify header information — headers already sent by (output started at /home/q/q97876x3/lixcompany.ru/public_html/admin/language/ru-ru/extension/feed/yandex_sitemap.php:1) in /home/q/q97876x3/lixcompany.ru/public_html/system/library/response.php on line 12

скачала и добавила файл с настройками для гугла и яндекса 3 одним файлом.
sitemap-1JzDeTT.php
В атрибутах — 755
Файлы 1_g_sitemap.xml и 1_ya_sitemap.xml создаваться не хотели.
Нашла в ваших ответах совет сделать их вручную. Сделала. Присвоила 755.
при переходе на
http://lixcompany.ru/sitemap-1JzDeTT.php
ошибка Ошибка HTTP 500
подскажите, что не так?
спасибо!

Александр
Александр

20 марта 2018, 00:30

Здравствуйте! Похожая проблема. ОС 3.0.2.0 Модуль Google Sitemap включен файл sitemap-1JzDeTT.php создал дал права 777. не работает пишет ошибку: Сайт kypilka.com.ua пока не может обработать этот запрос.
HTTP ERROR 500. Что может быть не так?

Александр
Александр

20 марта 2018, 01:22

Логи такие: [19-Mar-2018 22:18:12 UTC] PHP Warning: file_get_contents(http://kypilka.com.ua/index.php?route=extension/feed/google_sitemap): failed to open stream: HTTP request failed! in /home/kypilkac/public_html/sitemap-1JzDeTT.php on line 8
[19-Mar-2018 22:18:12 UTC] PHP Fatal error: Call to a member function asXML() on boolean in /home/kypilkac/public_html/sitemap-1JzDeTT.php on line 12

Sergey1900
Sergey1900

29 марта 2018, 10:10

У меня точно такая же ошибка.

Александр
Александр

29 марта 2018, 22:41

Спасибо, все работает отлично) При копировании появляется сообщение об авторских правах, пожалуйста уберите — раздражает, а кому надо все-равно скопирует)

Александр Окатьев

Обращайтесь! Хорошо, уберу)

Алекс
Алекс

3 апреля 2018, 23:33

Александр 20 марта 2018, 01:22 Логи такие: [19-Mar-2018 22:18:12 UTC] PHP Warning: file_get_contents(http://kypilka.com.ua/index.php?route=extension/feed/google_sitemap): failed to open stream: HTTP request failed! in /home/kypilkac/public_html/sitemap-1JzDeTT.php on line 8 [19-Mar-2018 22:18:12 UTC] PHP Fatal error: Call to a member function asXML() on boolean in /home/kypilkac/public_html/sitemap-1JzDeTT.php on line 12

Так ничего и не получилось. не работает ((( и никто не пишет комментариев.
Саша, можете помочь?

Александр Окатьев

Добрый день! Не разобрались с проблемой?

Андрей
Андрей

4 апреля 2018, 05:18

Алекс,

Возможно, функция allow_url_fopen в php.ini выключена.

У меня так было в php 5.6, а в php 5.4 все работало )) Разница была в наборе включенных функций в каждой из версий пхп

После того как запустил свой vps и настроил его многие проблемы и ограничения по производительности пропали

Алекс
Алекс

4 апреля 2018, 23:26

Включена. Вот что в этом файле.
magic_quotes_gpc = Off;
register_globals = Off;
default_charset = UTF-8;
memory_limit = 256M;
max_execution_time = 36000;
upload_max_filesize = 999M;
safe_mode = Off;
mysql.connect_timeout = 20;
session.auto_start = Off;
session.use_only_cookies = On;
session.use_cookies = On;
session.use_trans_sid = Off;
session.cookie_httponly = On;
session.gc_maxlifetime = 3600;
allow_url_fopen = on;
;display_errors = 1;
;error_reporting = E_ALL;

Алекс
Алекс

4 апреля 2018, 23:40

А можно уточнить что должно быть включено в php 5.6, чтобы все нормально работало?

Николай
Николай

8 апреля 2018, 01:49

Здравствуйте. А как бороться с ошибкой 504 Gateway Time-out?

Александр Окатьев

Здравствуйте! Необходимо увеличить время обработки запросов в конфигурационных файлах nginx и apache2.

Андрей
Андрей

10 апреля 2018, 13:25

Добрый день. Все делал по инструкции, но все равно выдает ошибку «Fatal error: Call to a member function asXML() on boolean in www/sitemap-1JzDeTT.php on line 13»

Александр Окатьев

Какую версию PHP используете на сервере и какая версия движка у Вас?

wb
wb

17 апреля 2018, 17:03

Подскажите пож-та
версия ОС 2,1 — гугл генерится без проблем, на яндексе спотыкается...
sitemap-1JzDeTT.php on line 13 и
sitemap-1JzDeTT.php on line 20
яндекс модуль установлен и работает — по ссылке из настроек модуля — sitemap открывается.

Александр Окатьев

Вы для своей версии движка скрипт брали из статьи?

Андрей
Андрей

9 мая 2018, 02:13

Если всё равно кроном дергаете скрипт, то почему бы wget’ом его не получать:

/usr/bin/wget timeout=60 no-check-certificate —output-document=/ваш/адрес/на/хостинге/до/папки/сайта/sitemap.xml -q «http://ваш.сайт/index.php?route=feed/google_sitemap»

ставим эту строку в cron
и sitemap.xml будет так же создаваться, но уже без неободимости в отдельном php-скрипте.

Александр Окатьев

Так wget’ом к нему и обращаемся, в конце статьи описано ведь.

Андрей
Андрей

14 мая 2018, 22:29

Так wget’ом к нему и обращаемся, в конце статьи описано ведь.

В статье вы обращаетесь к дополнительному скрипту, который, на мой взгляд, «излишняя сущность».
Не нужен никакой php-файл sitemap-1JzDeTT.php, в котором вы подгружаете конфиг, загружаете карту сайта в память (а карта сайта может быть довольно большая), разбираете в дерево xml и только потом пишете в файл.
Можно сразу wget’ом получить готовую карту сайта (она ведь уже готовая делается) средствами операционки, которая по любому быстрее работает (и экономнее по памяти), чем PHP интерпретатор,
см. https://pastebin.com/D2VzYNgK
а то в комментариях всю строку перекорёжило.
wget сразу идёт по адресу http://ваш.сайт/index.php?route=feed/google_sitemap который даёт нам готовую карту сайта, без необходимости с ней что-либо делать что-то ещё
и сохраняет в файл /ваш/адрес/на/хостинге/до/папки/сайта/sitemap.xml
Всё! ;-)

Ваш комментарий
адрес не будет опубликован
HTML-код не интерпретируется

Ctrl + Enter