Исключить определенные продукты из поколения Magento sitemap.xml

14

Мне нужно убедиться, что несколько продуктов НЕ находятся в сгенерированном Sitemap.xmlфайле в Magento. Я нашел пару примеров для таких вещей, как CMS Pages, но ничего не для того, чтобы делать страницы продукта, и более одного продукта. Я новичок в Magento

Кто-нибудь знает, как это можно сделать?

JasonDavis
источник

Ответы:

7

Нет, нет способа исключить определенные продукты из карты сайта, созданной Catalog -> Google Sitemapфункцией Magento .

Если я собираюсь сделать это программно, современные версии Magento (проверено в ветке 1.7.x, это может быть в более ранних версиях / EE) используют следующий класс модели ресурсов

Mage_Sitemap_Model_Resource_Catalog_Product

чтобы получить список продуктов.

#File: app/code/core/Mage/Sitemap/Model/Sitemap.php
$collection = Mage::getResourceModel('sitemap/catalog_product')->getCollection($storeId);

Это не стандартная модель Magento CRUD и getCollectionне возвращает объект коллекции. Вместо этого getCollectionвручную запрашивает базу данных для этих продуктов.

Если бы я собирался реализовать функциональность, которая препятствовала отображению определенных продуктов на карте сайта, я бы попробовал либо

  1. Класс переписать getCollectionметод, который вызывает parent::getCollection, а затем вручную отфильтровывает любые продукты из массива

  2. _addFilterПереписать класс, для которого вызывается метод parent :: _ addFilter, а затем добавляется дополнительное предложение WHERE, _selectчтобы исключить конкретный продукт (ы). Вроде как взлом, но это единственный метод, где у вас есть доступ к _selectобъекту, используемому для запроса к базе данных. В идеале вы хотели бы иметь какой-то глобальный / статический флаг, чтобы вы добавляли новые предложения WHERE только один раз.

Алан Сторм
источник
8

Начиная с Magento 1.9.0. Вы можете сделать это, не касаясь файла ядра.

Вы можете наблюдать два новых события:

  • sitemap_categories_generating_before
  • sitemap_products_generating_before

Чтобы исключить продукты на основе атрибута, вы можете сделать это:

  1. добавить наблюдателя в sitemap_products_generating_before

    App \ код \ сообщества \ My \ модуль \ и т.д. \ config.xml

        <events>
            <sitemap_products_generating_before>
                <observers>
                    <my_module>
                        <class>my_module/observer</class>
                        <method>excludeProductsFromSitemap</method>
                    </my_module>
                </observers>
            </sitemap_products_generating_before>
        </events>

    App \ код \ сообщества \ My \ Модуль \ Model \ Observer.php

    public function excludeProductsFromSitemap(Varien_Event_Observer $observer)
    {
        $collection = $observer->getCollection();
        $items = $collection->getItems();
    
        $excludeIds = Mage::getModel('catalog/product')
            ->getCollection()
            ->setStoreId($observer->getStoreId()) # requieres Magento 1.9.3.0
            ->addAttributeToFilter('use_in_sitemap', 0)
            ->getAllIds();
    
        foreach ($excludeIds as $id) {
            unset($items[$id]);
        }
    
        $collection->setItems($items);
    }
  2. добавить атрибут продукта "yes / no" named use_in_sitemap(может быть значение по умолчанию "yes")

  3. добавить этот атрибут ко всем наборам атрибутов
  4. установите продукты, которые вы хотите исключить, на "нет"
  5. создать карту сайта

Примечание : до Magento 1.9.3.0 атрибут должен быть установлен на globalвидимость.

sv3n
источник
3

Для этого вы можете сделать следующее:

  1. Создать атрибут для продукта, т. Е. exclude_from_sitemap(Да / нет)

  2. Перезаписать Mage_Sitemap_Model_Resource_Catalog_Productкласс и изменить getCollectionфункцию, добавив фильтр в новый атрибут, т.е. исключить из карты сайта

Если вы не разработчик, то следующий модуль может помочь в достижении вышеуказанного, но, конечно, это платное расширение.

http://www.scommerce-mage.co.uk/magento-extensions/magento-google-site-map-exclusion.html

stevensagaar
источник
1

Вы можете отключить эти продукты или установить в поле видимости значение «Не отображается по отдельности». В карте сайта указаны только включенные и видимые продукты.
Если вам нужны эти продукты, просто отключите их, создайте sitemap.xml и включите их снова.

Мариус
источник