Генерация SitemMap для VirtueMart используя Xmap

Есть в обслуживании большой магазин шин с 8к товарами. При попытке стандартной генерации карты сайта — генерится ограниченное количество товаров (обычно это число, указанное в настройках магазина, для вывода товаров на странице категории).И дополнительно ко всему этому — карта сайта генерится на лету — т.е. постоянно сильно нагружает сервер в момент генерации.

Первым делом идем по пути /administrator/components/com_virtuemart/models/ и находим файл product.php. Далее создаем его копию тут же и называем product-10k.php. В самом файле находим 2 момента и меняем в них значения на 10000:

находим

if(empty($limit)){
	$limit = 30;
}

меняем

if(empty($limit)){
	$limit = 10000;
}

находим

$maxNumber = VmConfig::get ('absMaxProducts', 700);

меняем

$maxNumber = VmConfig::get ('absMaxProducts', 10000);

Далее в корне сайта создайм файл-скрипт sitemap_generator.php и добавляем туда такой код:

<?php
error_reporting(E_ALL ^ E_NOTICE);
ini_set('display_errors', 'off');
ini_set('max_execution_time', '0');

$d_root = $_SERVER['DOCUMENT_ROOT'];

rename("$d_root/administrator/components/com_virtuemart/models/product.php", "$d_root/administrator/components/com_virtuemart/models/product-temp.php");
rename("$d_root/administrator/components/com_virtuemart/models/product-10k.php", "$d_root/administrator/components/com_virtuemart/models/product.php");

$url  = "http://test-site.com/component/xmap/xml/1.html?view=xml";
$path = $d_root.'/sitemap-vm.xml';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

if(!empty($data)) {
	file_put_contents($path, $data);
}

rename("$d_root/administrator/components/com_virtuemart/models/product.php", "$d_root/administrator/components/com_virtuemart/models/product-10k.php");

rename("$d_root/administrator/components/com_virtuemart/models/product-temp.php", "$d_root/administrator/components/com_virtuemart/models/product.php");


$file = fopen($path, 'r');
$text = fread($file, filesize($path));
fclose($file);
$file = fopen($path, 'w');
	$text = array_shift(explode('<br />', $text));
fwrite($file, $text);
fclose($file);
unset($text);

$fp = gzopen ($d_root.'/sitemap-vm.xml.gz', 'w9');
gzwrite ($fp, file_get_contents($path));
gzclose($fp);

вместо test-site.com - укажите свой сайт

после его работы на выходе в корне получаем 2 файла sitemap-vm.xml и sitemap-vm.xml.gz которые можем  добавлять в гугл или яндекс вебмастер-тулз

ПОЛЕЗНО  Virtuemart: Вывод значения кастомного поля

Иногда может возникнуть ошибка: Allowed memory size of 536870912 bytes exhausted для файла /libraries/joomla/application/component/view.php. Что бы от нее избавиться — находим в файле функцию public function loadTemplate($tpl = null) и в начале ее выполнения дописываем строку на увеличение лимита памяти:

public function loadTemplate($tpl = null)
{
	ini_set('memory_limit', '2048M');

Вот и все 🙂