Великий Sitemap в OpenCart 3x
Якщо у вас є багато сторінок продукту на OpenCart, то стандартний модуль Google Sitmap може не обробляти інформацію чи видавати через раз помилки, тому нижче буде надано код для розділу sitemap на кілька частин 500 посилань.
Будемо редагувати файл catalog/controller/extension/feed/google_sitemap.php та приводити до такого вигляду
<?php class ControllerExtensionFeedGoogleSitemap extends Controller { public function index() { if ($this->config->get('feed_google_sitemap_status')) { if(isset($_GET['manufacturers']) && $_GET['manufacturers']=='active'){ $output = $this->getManufactureresSiteMaps(); }elseif (isset($_GET['start'])) { $output = $this->getProductsSiteMaps($_GET['start'], $_GET['end']); }else{ $output ='<?xml version="1.0" encoding="UTF-8"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; $this->load->model('catalog/product'); $totalProducts = $this->model_catalog_product->getTotalProducts(); for($i=0; $i<$totalProducts; $i=$i+500 ){ $output .= '<sitemap><loc>'.HTTPS_SERVER.'index.php?route=extension/feed/google_sitemap&start=' . $i . '&end=500</loc><lastmod>2023-02-19T18:23:17+00:00</lastmod></sitemap>'; } $output .= '<sitemap><loc>'.HTTPS_SERVER.'index.php?route=extension/feed/google_sitemap&manufacturers=active</loc><lastmod>2023-02-19T18:23:17+00:00</lastmod></sitemap>'; $output.='</sitemapindex>'; } $this->response->addHeader('Content-Type: application/xml'); $this->response->setOutput($output); } } protected function getCategories($parent_id, $current_path = '') { $output = ''; $results = $this->model_catalog_category->getCategories($parent_id); foreach ($results as $result) { if (!$current_path) { $new_path = $result['category_id']; } else { $new_path = $current_path . '_' . $result['category_id']; } $output .= '<url>'; $output .= ' <loc>' . $this->url->link('product/category', 'path=' . $new_path) . '</loc>'; $output .= ' <changefreq>daily</changefreq>'; $output .= ' <priority>0.7</priority>'; $output .= '</url>'; // $this->load->model('catalog/product'); // $products = $this->model_catalog_product->getProducts(array('filter_category_id' => $result['category_id'])); // foreach ($products as $product) { // $output .= '<url>'; // $output .= ' <loc>' . $this->url->link('product/product', 'path=' . $new_path . '&product_id=' . $product['product_id']) . '</loc>'; // $output .= ' <changefreq>daily</changefreq>'; // $output .= ' <priority>1.0</priority>'; // $output .= '</url>'; // } $output .= $this->getCategories($result['category_id'], $new_path); } return $output; } protected function getProductsSiteMaps ($start, $end) { $output = '<?xml version="1.0" encoding="UTF-8"?>'; $output .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">'; $this->load->model('catalog/product'); $this->load->model('tool/image'); $filter_data = array( 'start' => $start, 'limit' => 500, ); $products = $this->model_catalog_product->getProducts($filter_data); foreach ($products as $product) { if ($product['image']) { $output .= '<url>'; $output .= ' <loc>' . $this->url->link('product/product', 'product_id=' . $product['product_id']) . '</loc>'; $output .= ' <changefreq>daily</changefreq>'; $output .= ' <lastmod>' . date('Y-m-d\TH:i:sP', strtotime($product['date_modified'])) . '</lastmod>'; $output .= ' <priority>1.0</priority>'; $output .= ' <image:image>'; $output .= ' <image:loc>' . $this->model_tool_image->resize($product['image'], $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_width'), $this->config->get('theme_' . $this->config->get('config_theme') . '_image_popup_height')) . '</image:loc>'; $output .= ' <image:caption>' . (str_replace('&', 'and', $product['name'])) . '</image:caption>'; $output .= ' <image:title>' . (str_replace('&', 'and', $product['name'])) . '</image:title>'; $output .= ' </image:image>'; $output .= '</url>'; } } $output .= '</urlset>'; return $output; } protected function getManufactureresSiteMaps(){ $output = '<?xml version="1.0" encoding="UTF-8"?>'; $output .= '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd http://www.google.com/schemas/sitemap-image/1.1 http://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; $this->load->model('catalog/category'); $output .= $this->getCategories(0); $this->load->model('catalog/manufacturer'); $manufacturers = $this->model_catalog_manufacturer->getManufacturers(); foreach ($manufacturers as $manufacturer) { $output .= '<url>'; $output .= ' <loc>' . $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $manufacturer['manufacturer_id']) . '</loc>'; $output .= ' <changefreq>daily</changefreq>'; $output .= ' <priority>0.7</priority>'; $output .= '</url>'; //$products = $this->model_catalog_product->getProducts(array('filter_manufacturer_id' => $manufacturer['manufacturer_id'])); // foreach ($products as $product) { // $output .= '<url>'; // $output .= ' <loc>' . $this->url->link('product/product', 'manufacturer_id=' . $manufacturer['manufacturer_id'] . '&product_id=' . $product['product_id']) . '</loc>'; // $output .= ' <changefreq>daily</changefreq>'; // $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>daily</changefreq>'; $output .= ' <priority>0.5</priority>'; $output .= '</url>'; } $output .= '</urlset>'; return $output; } }