Joomla. Как сделать свой sitemap или карту сайта.

Карта сайта необходима не только для поисковых систем, но и  для пользователей.

Скорее всего Вы выберите уже существующий компонент, но данный способ поможет разгрузить систему от лишних запросов и установки новых компонентов.

В моем случае все же понадобилось установить плагин, который подключает php файл. Если нужен плагин напишите в комментариях выложу.

Первым делом сформируем запрос к БД используя API Joomla.

/*формируем запрос*/
$db = &JFactory::getDbo();  // БД
$query = $db->getQuery(true);
$query->from('_menu'); // таблица с меню (не забудьте префикс )
$query->select($db->quoteName(array('id', 'parent_id','title', 'alias', 'menutype'))); // необходимые поля в выборке
$query->where('published = 1'); // только опубликованные пункты меню
$query->where('access = 1'); // уровень доступа публичный
/* язык карты */
if ($lang == 'en-GB') {
 $query->where('language = "en-GB"'); // язык меню
 $query->whereOr('language = "*"'); // язык меню любой
} else {
 $query->where('language = "ru-RU"'); // язык меню
 $query->whereOr('language = "*"'); // язык меню любой
}
$db->setQuery($query); // запрос
$results = $db->loadRowList(); // ссылки меню

Далее форматируем запрос под функцию

/*формат функции*/
foreach ($results as $key => $value)
	$menu[$value[1]][$value[0]] = $value;

Вызываем функцию для формирования дерева меню

build_tree($menu,1, $perm, $lang);

Итоговый код

<?php
function build_tree($cats,$parent_id,$perm = false, $lang = 'ru-RU'){
	$param = &JRequest::getVar('param'); // параметр all (для получения всех данных о меню)
	if ( $lang == 'en-GB' ) {
		$uri = JURi::base().'en/'; // для языковых версий языка
	} else {
		$uri = JURi::base();
	}
	$all = &JRequest::getUri(); // вся карта сайта
	$class = ''; // класс списка меню
	$menutype = ''; // название меню к которому пункт принадлежит

	if(is_array($cats) and isset($cats[$parent_id])){
		//0 id
		//1 parent_id
		//2 title
		//3 link
		//4 menutype

		$tree = '<ul>';
		foreach($cats[$parent_id] as $cat) {
			$base = JFactory::getApplication()->getMenu()->getItem($cat[0]);

			preg_match("/\d{4}.\d{2}-\d{2}-\d{2}-\d{2}-\d{2}/U", $base->route, $matches);

			if (strpos($all, 'sitemap-all') && count($matches) != 0 && $base->type != 'url') {
				$class = 'error';
			}

			$menutype = $cat[4];

			if ( (count($matches) == 0 && $perm == false) || ($perm == true && $param == 'all') || count($matches) == 0 || strpos($all, 'sitemap-all') || $base->type == 'url' ) {

				if ($base->type == 'url') {
					$tree .= '<li class="'.$class.'"><a href="'.$base->link .'">'.$cat[2].'</a>';
				} else {
					$tree .= '<li class="'.$class.'"><a href="'.$uri. $base->route .'">'.$cat[2].'</a>';
				}

				if (strpos($all, 'sitemap-all')) {
					$tree .= ' <span class="menutype">'.$menutype.'</span>';
				}
				$tree .=  build_tree($cats,$cat[0],$perm, $lang);
				$tree .= '</li>';
			}
			$class = '';
			$matches = [];
		}

		$tree .= '</ul>';
	}
	else return null;
	return $tree;
}

$db = &JFactory::getDbo();  // БД
$language = &JFactory::getLanguage();  // язык
$lang = $language->getTag();  // язык
$user = &JFactory::getUser(); // юзер

/*права редактирования файлов*/
/* принадлежность к группе */
if (in_array(8, $user->groups)) {
	$perm= true;
} else {
	$perm= false;
}

/* права редактирования */
/*if ($user->authorise( 'com_content', 'edit', 'content', 'all' )) {
	$perm= true;
} else {
	$perm = false;
}*/

/*формируем запрос*/
$query = $db->getQuery(true);
$query->from('tsp15_menu');
$query->select($db->quoteName(array('id', 'parent_id','title', 'alias', 'menutype')));
$query->where('published = 1');
$query->where('access = 1');
/* язык карты*/
if ($lang == 'en-GB') {
	$query->where('language = "en-GB"');
	$query->whereOr('language = "*"');
} else {
	$query->where('language = "ru-RU"');
	$query->whereOr('language = "*"');
}
$db->setQuery($query);
$results = $db->loadRowList(); // ссылки меню

/*формат функции*/
foreach ($results as $key => $value)
	$menu[$value[1]][$value[0]] = $value;

echo build_tree($menu,1, $perm, $lang);
?>
<style type="text/css">
	li.error {
		color:green;
		/*border-bottom: 0.1px solid red;*/
	}
	.menutype {
		color: #000;
		background-color: #ffa58a;
	}
</style>