将站点地图分离到多个文件

Separate sitemap to multiple files

我正在使用 opencart 2 和默认站点地图生成器在一个文件中生成所有内容我的意思是所有产品、类别、图像等,打开文件需要很长时间。我怎样才能做出类似的东西:

产品将存储在 sitemap-product.xml

要存储在 sitemap-category.xml

中的类别

要存储在 sitemap-image.xml

中的图像

并且全部附加到 sitemap.xml

public function index() {
    if ($this->config->get('google_sitemap_status')) {
        $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');

        $products = $this->model_catalog_product->getProducts();

        foreach ($products as $product) {
            if ($product['image']) {
                $output .= '<url>';
                $output .= '<loc>' . $this->url->link('product/product', 'product_id=' . $product['product_id']) . '</loc>';
                $output .= '<changefreq>weekly</changefreq>';
                $output .= '<priority>1.0</priority>';
                $output .= '<image:image>';
                $output .= '<image:loc>' . $this->model_tool_image->resize($product['image'], $this->config->get('config_image_popup_width'), $this->config->get('config_image_popup_height')) . '</image:loc>';
                $output .= '<image:caption>' . $product['name'] . '</image:caption>';
                $output .= '<image:title>' . $product['name'] . '</image:title>';
                $output .= '</image:image>';
                $output .= '</url>';
            }
        }

        $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>weekly</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>weekly</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>weekly</changefreq>';
            $output .= '<priority>0.5</priority>';
            $output .= '</url>';
        }

        $output .= '</urlset>';

        $this->response->addHeader('Content-Type: application/xml');
        $this->response->setOutput($output);
    }
}

你能做的很简单。您尝试扩展的控制器是 url:

index.php?route=feed/google_sitemap or index.php?route=extension/feed/google_sitemap if you are using opencart 2.3.x

上面的url加载了public函数index(),所以等同于:

index.php?route=feed/google_sitemap/index

现在,复制 public 函数索引 () 并创建一个名为 products 的新函数。它应该是这样的:

public function products() {
    if ($this->config->get('google_sitemap_status')) {
        $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');

        $products = $this->model_catalog_product->getProducts();

        foreach ($products as $product) {
            if ($product['image']) {
                $output .= '<url>';
                $output .= '<loc>' . $this->url->link('product/product', 'product_id=' . $product['product_id']) . '</loc>';
                $output .= '<changefreq>weekly</changefreq>';
                $output .= '<priority>1.0</priority>';
                $output .= '<image:image>';
                $output .= '<image:loc>' . $this->model_tool_image->resize($product['image'], $this->config->get('config_image_popup_width'), $this->config->get('config_image_popup_height')) . '</image:loc>';
                $output .= '<image:caption>' . $product['name'] . '</image:caption>';
                $output .= '<image:title>' . $product['name'] . '</image:title>';
                $output .= '</image:image>';
                $output .= '</url>';
            }
        }

        $output .= '</urlset>';

        $this->response->addHeader('Content-Type: application/xml');
        $this->response->setOutput($output);
    }
}

现在如果调用 url:

index.php?route=feed/google_sitemap/products

它应该只加载产品。它不会创建您想要的文件,但会即时为产品创建站点地图 xml。

编辑/附加信息: 如果您有数千种产品,您可以轻松添加一些限制。

public function products() {
    if ($this->config->get('google_sitemap_status')) {
        $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');

        $data = [];

        if (isset($this->request->get['start'])) {
            $data['start'] = $this->request->get['start'];
        } else {
            $data['start'] = 0;

        }

        if (isset($this->request->get['limit'])) {
            $data['limit'] = $this->request->get['limit'];
        } else {
            $data['limit'] = 2000; /* Change the default value for the limit */
        }

        $products = $this->model_catalog_product->getProducts($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>weekly</changefreq>';
                $output .= '<priority>1.0</priority>';
                $output .= '<image:image>';
                $output .= '<image:loc>' . $this->model_tool_image->resize($product['image'], $this->config->get('config_image_popup_width'), $this->config->get('config_image_popup_height')) . '</image:loc>';
                $output .= '<image:caption>' . $product['name'] . '</image:caption>';
                $output .= '<image:title>' . $product['name'] . '</image:title>';
                $output .= '</image:image>';
                $output .= '</url>';
            }
        }

        $output .= '</urlset>';

        $this->response->addHeader('Content-Type: application/xml');
        $this->response->setOutput($output);
    }
}

假设您有 50000 件产品。 url 获取前 25000 个产品的示例:

index.php?route=feed/google_sitemap/products&start=0&limit=25000

然后获取剩余的25000个产品

index.php?route=feed/google_sitemap/products&start=25000&limit=25000


您可以对类别、图像、信息页面等执行相同的操作

PS: 当然要加载上面的urls,你需要添加你的域名作为前缀:D

希望对您有所帮助。