PHP Magento Tips

Powered by Blogger.

Magento Shell PHP Script for Generating pages, categories and products Sitemap

Rate this posting:
{[['']]}

Using a custom class and Magento specific (collections) code, this simple script is designed to be used via the command line / cron job to generate a Google compatible XML sitemap.

Installation

Upload the sitemap.php file to your Magento shell folder (within the root).
The sitemap generator can then be run via the command line with php shell/sitemap.php or set up as a regular task via crontab.

 

Output

When run, the script will ouput a sitemap.xml file in the parent directory to the sitemap.php file (see below for changing path).
The XML file will contain:
  • All CMS pages which are have status Active
  • All Catalog Categories which have status Enabled
  • All Catalog Products which are Enabled and have visibility "Catalog" or "Catalog, Search"
<?php
class PT_Magento_Sitemap {
    protected $file;
    protected $filename;
    protected $urls;
    
    public function __construct($filename)
    {    
        $this->urls = array();
        $this->filename = $filename;
    }
    
    public function formatDate($datetime)
    {
        $timestamp = strtotime($datetime);
        return date('Y-m-d', $timestamp);
    }
    
    public function addUrl($loc, $priority = '1', $lastmod = NULL)
    {
        $this->urls[] = array(
            'loc' => $loc,
            'priority' => $priority,
            'lastmod' => ( $lastmod ? $this->formatDate($lastmod) : NULL ),
        );
        
        return true;
    }
    
    public function generate()
    {
        if ( ! $this->file ) {
            $this->openFile();
        }
    
        if ( ! $this->urls ) {
            return false;
        }
    
        foreach ( $this->urls as $url )  {
            $this->writeUrl($url);
        }
        
        $this->closeFile();
        
        return true;
    }
    
    private function openFile()
    {
        $this->file = fopen($this->filename, 'w');
        
        if ( ! $this->file ) {
            throw new Exception('Sitemap file '.$file.' is not writable');
            return false;
        }
        
        fwrite($this->file, '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL);
        fwrite($this->file, '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'.PHP_EOL);
        
        return true;
    }
    
    private function closeFile()
    {
        if ( $this->file ) {
            fwrite($this->file, "</urlset>");
            fclose($this->file);
        }
        
        return true;
    }
    
    private function writeUrl($url)
    {
        fwrite($this->file,  "\t".'<url>'."\n".
               "\t\t".'<loc>'.$url['loc'].'</loc>'."\n".
               "\t\t".'<priority>'.$url['priority'].'</priority>'."\n".
               ( $url['lastmod'] ? "\t\t".'<lastmod>'.$url['lastmod'].'</lastmod>'."\n" : '' ).
               "\t".'</url>'."\n");
    }
}
    
// make sure we don't time out
error_reporting(E_ALL);
set_time_limit(0);    
require_once (dirname(__FILE__).'/../app/Mage.php');
Mage::app();
$sitemap_file = dirname(__FILE__).'/../sitemap.xml';
$page_priority = '1';
$category_priority = '0.5';
$product_priority = '0.5';
       
try {
    $sitemap = new PT_Magento_Sitemap($sitemap_file);
    
    $collection = Mage::getModel('cms/page')
                        ->getCollection()
                        ->addStoreFilter(Mage::app()->getStore()->getId())
                        ->addFieldToFilter('is_active',1);
                        
    foreach ( $collection as $page ) {
        $sitemap->addUrl(Mage::getBaseUrl().$page->getIdentifier(), $page_priority, $page->getUpdateTime());
    }
    
    unset($collection);
    
    $collection = Mage::getModel('catalog/category')
                        ->getCollection()
                        ->addAttributeToSelect('*')
                        ->addIsActiveFilter();
                        
    foreach ( $collection as $category ) {
        $sitemap->addUrl($category->getUrl(), $category_priority, $category->getUpdatedAt());
    }
    
    unset($collection);
    $collection = Mage::getModel('catalog/product')
                    ->getCollection()
                    ->addAttributeToSelect('*')
                    ->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED)
                    ->addAttributeToFilter('visibility', array(
                        Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,                                                            Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
                    ));
                    
    foreach ( $collection as $product ) {
        $sitemap->addUrl($product->getProductUrl(), $product_priority, $product->getUpdatedAt());
    }
    
    unset($collection);
        
    // Generate and write the sitemap.
    $sitemap->generate();
} catch( Exception $e ) {
    die($e->getMessage());
    
} 

Configuration

You can change the priority field of the different url types and the path of the required Magento Mage.php and outputted sitemap.xml file by updating the lines below:

require_once (dirname(__FILE__).'/../app/Mage.php');
Mage::app();

$sitemap_file = dirname(__FILE__).'/../sitemap.xml';

$page_priority = '1';
$category_priority = '0.5';
$product_priority = '0.5';
1 Comments On " Magento Shell PHP Script for Generating pages, categories and products Sitemap"

Binance wallet and exchange is popular in the world with a market capitalization of massive number in such a short span. If you are facing trouble while sending cryptocurrency to another wallet in the Binance exchange, you can call on Binance support phone number 1(833)-464-7652 which is functional and users can have conversation with the team anytime related to trouble. Reach the team and get rid of troubles immediately from the roots in no time. The team is always by your side and help in fixing all your troubles immediately.

Back To Top