В очередной раз спасибо afwollis. Оперативно помог за символическую плату.
Итак, чтобы получить полный путь в canonical у подкатегорий opencart нужно:
catalog/controller/product/category.php
1.
$this->document->addLink($this->url->link('product/category', 'path=' . $category_info['category_id'], 'SSL'), 'canonical');>>
//$this->document->addLink($this->url->link('product/category', 'path=' . $category_info['category_id'], 'SSL'), 'canonical');
$this->document->addLink($this->url->link('product/category', 'path='.$this->getCanonicalPath($category_id), 'SSL'), 'canonical');
2. перед @public function index() {@ добавить
protected function getCanonicalPath($category_id) {
$category_id = (int)$category_id;
if ($category_id < 1) return false;
static $path = null;
if (!is_array($path)) {
$path = $this->cache->get('category.seopath');
if (!is_array($path)) $path = array();
}
if (!isset($path[$category_id])) {
$max_level = 10;
$sql = "SELECT CONCAT_WS('_'";
for ($i = $max_level-1; $i >= 0; --$i) {
$sql .= ",t$i.category_id";
}
$sql .= ") AS path FROM " . DB_PREFIX . "category t0";
for ($i = 1; $i < $max_level; ++$i) {
$sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)";
}
$sql .= " WHERE t0.category_id = '" . $category_id . "'";
$query = $this->db->query($sql);
$path[$category_id] = $query->num_rows ? $query->row['path'] : false;
$this->cache->set('category.seopath', $path);
}
return $path[$category_id];
}