我想在我的Magento网站sitemap.xml
中包含那些不应被搜索引擎编入索引的页面。为此,我已将Catalog/Category.php Cms/Page.php
复制到相应的app/code/local
目录中,我正在对其进行修改。
我已成功修改Page.php
以从我的sitemap.xml
中排除特定的CMS网页。我按照给出here
由于我不熟悉PHP,我不知道要为Category.php
文件调整此解决方案需要做哪些更改。
以下是我目前的Category.php
文件,该文件未从sitemap.xml
中排除我想要的任何特定类别页面:
<?php
class Mage_Sitemap_Model_Resource_Catalog_Category extends Mage_Core_Model_Resource_Db_Abstract
{
/**
* Collection Zend Db select
*
* @var Zend_Db_Select
*/
protected $_select;
/**
* Attribute cache
*
* @var array
*/
protected $_attributesCache = array();
/**
* Init resource model (catalog/category)
*
*/
protected function _construct()
{
$this->_init('catalog/category', 'entity_id');
}
/**
* Get category collection array
*
* @param unknown_type $storeId
* @return array
*/
public function getCollection($storeId)
{
$categories = array();
$store = Mage::app()->getStore($storeId);
/* @var $store Mage_Core_Model_Store */
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;
}
$urConditions = array(
'e.entity_id=ur.category_id',
$this->_getWriteAdapter()->quoteInto('ur.store_id=?', $store->getId()),
'ur.product_id IS NULL',
$this->_getWriteAdapter()->quoteInto('ur.is_system=?', 1),
);
$this->_select = $this->_getWriteAdapter()->select()
->from(array('e' => $this->getMainTable()), array($this->getIdFieldName()))
->joinLeft(
array('ur' => $this->getTable('core/url_rewrite')),
join(' AND ', $urConditions),
array('url'=>'request_path')
)
->where('e.path LIKE ?', $categoryRow['path'] . '/%');
$this->_addFilter($storeId, 'is_active', 1);
$query = $this->_getWriteAdapter()->query($this->_select);
while ($row = $query->fetch()) {
$category = $this->_prepareCategory($row);
$categories[$category->getId()] = $category;
}
return $categories;
}
/**
* Prepare category
*
* @param array $categoryRow
* @return Varien_Object
*/
protected function _prepareCategory(array $categoryRow)
{
$category = new Varien_Object();
$category->setId($categoryRow[$this->getIdFieldName()]);
$categoryUrl = !empty($categoryRow['url']) ? $categoryRow['url'] : 'catalog/category/view/id/' . $category->getId();
$category->setUrl($categoryUrl);
return $category;
}
/**
* Add attribute to filter
*
* @param int $storeId
* @param string $attributeCode
* @param mixed $value
* @param string $type
* @return Zend_Db_Select
*/
protected function _addFilter($storeId, $attributeCode, $value, $type = '=')
{
if (!isset($this->_attributesCache[$attributeCode])) {
$attribute = Mage::getSingleton('catalog/category')->getResource()->getAttribute($attributeCode);
$this->_attributesCache[$attributeCode] = array(
'entity_type_id' => $attribute->getEntityTypeId(),
'attribute_id' => $attribute->getId(),
'table' => $attribute->getBackend()->getTable(),
'is_global' => $attribute->getIsGlobal(),
'backend_type' => $attribute->getBackendType()
);
}
$attribute = $this->_attributesCache[$attributeCode];
if (!$this->_select instanceof Zend_Db_Select) {
return false;
}
switch ($type) {
case '=':
$conditionRule = '=?';
break;
case 'in':
$conditionRule = ' IN(?)';
break;
default:
return false;
break;
}
if ($attribute['backend_type'] == 'static') {
$this->_select->where('e.' . $attributeCode . $conditionRule, $value);
} else {
$this->_select->join(
array('t1_'.$attributeCode => $attribute['table']),
'e.entity_id=t1_'.$attributeCode.'.entity_id AND t1_'.$attributeCode.'.store_id=0',
array()
)
->where('t1_'.$attributeCode.'.attribute_id=?', $attribute['attribute_id']);
if ($attribute['is_global']) {
$this->_select->where('t1_'.$attributeCode.'.value'.$conditionRule, $value);
} else {
$ifCase = $this->_select->getAdapter()->getCheckSql('t2_'.$attributeCode.'.value_id > 0', 't2_'.$attributeCode.'.value', 't1_'.$attributeCode.'.value');
$this->_select->joinLeft(
array('t2_'.$attributeCode => $attribute['table']),
$this->_getWriteAdapter()->quoteInto('t1_'.$attributeCode.'.entity_id = t2_'.$attributeCode.'.entity_id AND t1_'.$attributeCode.'.attribute_id = t2_'.$attributeCode.'.attribute_id AND t2_'.$attributeCode.'.store_id=?', $storeId),
array()
)
->where('('.$ifCase.')'.$conditionRule, $value);
}
}
return $this->_select;
}
}
编辑:非常感谢卢克在下面的评论中!这对我有用。我不得不稍微修改一下代码,因为在if语句之后才定义$ category。
while ($row = $query->fetch()) {
// Added to exclude specific categories
if(in_array($this->_prepareCategory($row)->getId(), $this->ignoreCategories))
{
continue;
}
$category = $this->_prepareCategory($row);
$categories[$category->getId()] = $category;
}
我为类别ID创建了类属性,正如Luke所说:
protected $ignoreCategories = array("2","3","16");//Replace the numbers with your category IDs
答案 0 :(得分:1)
对于快速解决方案,请添加以下代码,更好的方法是将属性添加到类别EAV,然后使用它来检查它是否应包含在站点地图输出中。
对于快速入侵,请添加一个数组作为应忽略的类别ID的类属性,
protected $ ignoreCategories = array(“2”,“3”,“16”);
然后在getCollection()函数的底部附近检查这些ID,
while($ row = $ query-&gt; fetch()){
// Added to exclude specific categories
if(in_array($category->getId(), $this->ignoreCategories)
{
continue;
}
$category = $this->_prepareCategory($row);
$categories[$category->getId()] = $category;
}