Unable to generate the sitemap
-
20-02-2021 - |
Question
Magento fails to generate the sitemap.xml. I get Unable to generate the sitemap.
.
I get this exception:
2019-02-25T15:00:59+00:00 DEBUG (7): Exception message: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'NULLurl_rewrite.id_path LIKE 'category/%'
INNER JOIN `magecatalog_category_enti' at line 2, query was: SELECT `main_table`.`entity_id`, `url_rewrite`.`request_path` FROM `magecatalog_category_entity` AS `main_table`
LEFT JOIN `magecore_url_rewrite` AS `url_rewrite` ON url_rewrite.category_id=main_table.entity_id AND url_rewrite.is_system=1 AND url_rewrite.store_id = 1 AND url_rewrite.category_id IS NOT NULLurl_rewrite.id_path LIKE 'category/%'
INNER JOIN `magecatalog_category_entity_int` AS `t1_is_active` ON main_table.entity_id=t1_is_active.entity_id AND t1_is_active.store_id=0
LEFT JOIN `magecatalog_category_entity_int` AS `t2_is_active` ON t1_is_active.entity_id = t2_is_active.entity_id AND t1_is_active.attribute_id = t2_is_active.attribute_id AND t2_is_active.store_id = 1 WHERE (main_table.path LIKE '1/2/%') AND (t1_is_active.attribute_id='42') AND ((IF(t2_is_active.value_id > 0, t2_is_active.value, t1_is_active.value))=1)
Trace: #0 /home/company/live/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
#1 /home/company/live/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
#2 /home/company/live/lib/Zend/Db/Adapter/Abstract.php(480): Zend_Db_Statement->execute(Array)
#3 /home/company/live/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT `main_ta...', Array)
#4 /home/company/live/lib/Varien/Db/Adapter/Pdo/Mysql.php(504): Zend_Db_Adapter_Pdo_Abstract->query('SELECT `main_ta...', Array)
#5 /home/company/live/app/code/core/Mage/Sitemap/Model/Resource/Catalog/Abstract.php(164): Varien_Db_Adapter_Pdo_Mysql->query(Object(Varien_Db_Select))
#6 /home/company/live/app/code/core/Mage/Sitemap/Model/Resource/Catalog/Category.php(80): Mage_Sitemap_Model_Resource_Catalog_Abstract->_loadEntities()
#7 /home/company/live/app/code/core/Mage/Sitemap/Model/Sitemap.php(154): Mage_Sitemap_Model_Resource_Catalog_Category->getCollection('1')
#8 /home/company/live/app/code/core/Mage/Adminhtml/controllers/SitemapController.php(255): Mage_Sitemap_Model_Sitemap->generateXml()
#9 /home/company/live/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_SitemapController->generateAction()
#10 /home/company/live/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('generate')
#11 /home/company/live/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#12 /home/company/live/app/code/core/Mage/Core/Model/App.php(365): Mage_Core_Controller_Varien_Front->dispatch()
#13 /home/company/live/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#14 /home/company/live/index.php(70): Mage::run('', 'store')
#15 {main}
The error only appears in our live shop, in the test shop it works fine, even if I checkout the live shop branch in git and the staging area is clean
The permission of the sitemap.xml is set to -rw-rw-rw
in both shops.
Solution 2
I tracked down the exact problem code line.
It is inside the function getCollection()
from the class Mage_Sitemap_Model_Resource_Catalog_Category
:
public function getCollection($storeId)
{
/* @var $store Mage_Core_Model_Store */
$store = Mage::app()->getStore($storeId);
if (!$store) {
return false;
}
$this->_select = $this->_getWriteAdapter()->select()
->from($this->getMainTable())
->where($this->getIdFieldName() . '=?', $store->getRootCategoryId());
$categoryRow = $this->_getWriteAdapter()->fetchRow($this->_select);
if (!$categoryRow) {
return false;
}
$this->_select = $this->_getWriteAdapter()->select()
->from(array('main_table' => $this->getMainTable()), array($this->getIdFieldName()))
->where('main_table.path LIKE ?', $categoryRow['path'] . '/%');
$storeId = (int)$store->getId();
/** @var $urlRewrite Mage_Catalog_Helper_Category_Url_Rewrite_Interface */
$urlRewrite = $this->_factory->getCategoryUrlRewriteHelper();
$urlRewrite->joinTableToSelect($this->_select, $storeId); // <-- Problem is here
$this->_addFilter($storeId, 'is_active', 1);
return $this->_loadEntities();
}
I workaround it by overriding the method in my own extension and changing the function to this:
public function getCollection($storeId)
{
/* @var $store Mage_Core_Model_Store */
$store = Mage::app()->getStore($storeId);
if (!$store) {
return false;
}
$this->_select = $this->_getWriteAdapter()->select()
->from($this->getMainTable())
->where($this->getIdFieldName() . '=?', $store->getRootCategoryId());
$categoryRow = $this->_getWriteAdapter()->fetchRow($this->_select);
if (!$categoryRow) {
return false;
}
$this->_select = $this->_getWriteAdapter()->select()
->from(array('main_table' => $this->getMainTable()), array($this->getIdFieldName()))
->where('main_table.path LIKE ?', $categoryRow['path'] . '/%');
$storeId = (int)$store->getId();
/** @var $urlRewrite Mage_Catalog_Helper_Category_Url_Rewrite_Interface */
$urlRewrite = $this->_factory->getCategoryUrlRewriteHelper();
$urlRewrite->joinTableToSelect($this->_select, $storeId);
// Workaround to fix "Unable to generate sitemap" error only happening on live store
$this->_select = str_replace("IS NOT NULLurl_rewrite.id_path", "IS NOT NULL AND url_rewrite.id_path", $this->_select);
$this->_addFilter($storeId, 'is_active', 1);
return $this->_loadEntities();
}
I am still confused why this only happens in my live store even though the code on my dev store is 1:1 the same.
OTHER TIPS
There was an error in your SQL:
AND url_rewrite.category_id IS NOT NULLurl_rewrite.id_path LIKE 'category/%'
should looks like:
AND url_rewrite.category_id IS NOT NULL AND url_rewrite.id_path LIKE 'category/%'
Possible there was some kind of modifications made by some third-party observer. Take a look at modules installed in your system and check all its observers.
Another modifications could exists inside the app/code/local
directory (using replace of the core class). Check it too.
Try below to see what is actually causing the error before applying the above solution!;
Open the file;
app/code/core/Mage/Adminhtml/controllers/SitemapController.php
Find the line:
$this->_getSession()->addException($e, Mage::helper('sitemap')->__('Unable to generate the sitemap.'));
And replace it with:
$this->_getSession()->addException($e, $e->getMessage());
and try to see if you can run the sitemap again. hope this should be able to help better!