用于从Magento中的sitemap.xml中排除特定类别页面的PHP代码

时间:2012-12-27 22:51:46

标签: php magento seo sitemap

我想在我的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

1 个答案:

答案 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;

}