Великий 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&amp;start=' . $i . '&amp;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&amp;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;
    }
}

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

  • Не дозволено жодних HTML теґів.
  • Рядки й абзаци переносяться автоматично.
  • Адреси вебсторінок та адреси електронної пошти автоматично перетворюються у посилання.
Код мови коментаря.