PHP代码排除特定类别页面从sitemap.xml在Magento


PHP code to exclude specific category page from sitemap.xml in Magento

我想包括那些页面从我的Magento网站的sitemap.xml不应该被搜索引擎索引。为此,我将Catalog/Category.php Cms/Page.php复制到相应的app/code/local目录中,并对其进行修改。

我已经成功地修改了Page.php,从我的sitemap.xml中排除了特定的CMS页面。我按照这里给出的指示做的

由于我不熟悉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;
} 
}

编辑:非常感谢Luke在下面的评论!以下是对我有效的方法。我必须稍微修改一下代码,因为$category直到if语句之后才定义。

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创建了class属性,就像Luke说的:

protected $ignoreCategories = array("2","3","16");//Replace the numbers with your category IDs

一个快速的解决方案是添加下面的代码,一个更好的方法是添加一个属性到类别EAV,然后用它来检查它是否应该包含在站点地图输出中。

为了快速破解,添加一个数组作为类属性,用于应该被忽略的类别id,

保护$ ignoreCategories =阵列("2"、"3"、"16");

然后在getCollection()函数的底部检查这些ID,

while ($row = $query->fetch()) {

// Added to exclude specific categories
if(in_array($category->getId(), $this->ignoreCategories)
{
    continue;
}
    $category = $this->_prepareCategory($row);
    $categories[$category->getId()] = $category;

}