Исключите определенные продукты из Magento sitemap.xml поколение
Мне нужно убедиться, что несколько продуктов НЕ в сгенерированном файле Sitemap.xml
в Magento. Я нашел пару примеров для таких вещей, как страницы CMS, но ничего для создания страниц продуктов и более 1 продукта. Я совершенно новичок в Magento
Кто-нибудь знает, как это можно сделать?
4 answers
Из коробки, нет, нет способа исключить определенные продукты из карты сайта, созданной функцией Magento Catalog -> Google Sitemap
.
Если бы я собирался сделать это программно, современные версии 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);
Это не стандартная модель CRUD Magento, и getCollection
не возвращает коллекцию объект. Вместо этого getCollection
вручную запрашивает базу данных для этих продуктов.
Если бы я собирался реализовать функциональность, которая не позволяла бы определенным продуктам отображаться на карте сайта, я бы попытался либо
Класс переписывает метод
getCollection
, который вызывает методparent::getCollection
, а затем вручную отфильтровывает любые продукты из массиваКласс перезаписывает
_addFilter
, который вызывает метод parent::_addfilter, а затем добавляет дополнительное предложение(предложения) WHERE в_select
для исключения конкретного продукта (ов). Своего рода взлом, но это единственный метод, при котором у вас есть доступ к объекту_select
, используемому для запроса базы данных. В идеале вы хотели бы иметь какой-то глобальный/статический флаг, поэтому вы добавили свое новое предложение(предложения) WHERE только один раз.
Начиная с Magento 1.9.0. вы можете сделать это, не касаясь ни одного основного файла.
Вы можете наблюдать два новых события:
sitemap_categories_generating_before
sitemap_products_generating_before
Чтобы исключить продукты на основе атрибута, вы можете сделать следующее:
-
Добавьте наблюдателя в
sitemap_products_generating_before
App\code\community\My\Module\etc\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\code\community\My\Module\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); }
Добавьте атрибут продукта "да/нет" с именем
use_in_sitemap
(возможно, значение по умолчанию "да")- добавьте этот атрибут во все наборы атрибутов
- установите для продуктов, которые вы хотите исключить, значение "нет"
- создайте свою карту сайта
Примечание: до версии Magento 1.9.3.0 атрибут должен быть установлен в область global
.
Для достижения этой цели вы можете сделать следующее -:
Создайте атрибут для продукта, т.е.
exclude_from_sitemap
(Да/Нет)Перепишите класс
Mage_Sitemap_Model_Resource_Catalog_Product
и измените функциюgetCollection
, добавив фильтр к вашему новому атрибуту, т.е. исключите из карты сайта
Если вы не являетесь разработчиком, то следующий модуль может помочь в достижении вышеуказанного, но, конечно, он платный расширение
Http://www.scommerce-mage.co.uk/magento-extensions/magento-google-site-map-exclusion.html
Вы можете отключить эти продукты или установить для поля видимости значение "Не видно по отдельности". В карте сайта перечислены только включенные и видимые продукты.
Если вам нужно, чтобы эти продукты были включены, просто отключите их, создайте sitemap.xml и включите их снова.