Exclure certains produits de la génération Magento sitemap.xml

14

Je dois m'assurer qu'une poignée de produits ne sont PAS dans le Sitemap.xmlfichier généré dans Magento. J'ai trouvé quelques exemples pour des choses comme CMS Pages mais rien pour faire des pages de produits, et plus d'un produit. Je suis tout nouveau à Magento

Quelqu'un sait comment cela peut être fait?

JasonDavis
la source

Réponses:

7

Hors de la boîte, non, il n'y a aucun moyen d'exclure certains produits du plan du site généré par la Catalog -> Google Sitemapfonctionnalité de Magento .

Si j'allais faire cela par programme, les versions modernes de Magento (vérifiées dans la branche 1.7.x, cela pourrait être dans les versions antérieures / EE) utilisent la classe de modèle de ressource suivante

Mage_Sitemap_Model_Resource_Catalog_Product

pour récupérer une liste de produits.

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

Ce n'est pas un modèle CRUD Magento standard et getCollectionne renvoie pas d'objet de collection. Au lieu de cela, getCollectioninterroge manuellement la base de données pour ces produits.

Si j'allais implémenter une fonctionnalité qui empêchait certains produits d'apparaître dans le plan du site, j'essaierais soit

  1. Une classe réécrit la getCollectionméthode qui appelle le parent::getCollection, puis filtre manuellement tous les produits du tableau

  2. Une réécriture de classe sur _addFilterlaquelle appelle la méthode parent :: _ addFilter, puis ajoute une ou plusieurs clauses WHERE supplémentaires _selectpour exclure le ou les produits spécifiques. Une sorte de hack, mais c'est la seule méthode où vous avez accès à l' _selectobjet utilisé pour interroger la base de données. Idéalement, vous voudriez avoir une sorte d'indicateur global / statique, vous n'avez donc ajouté vos nouvelles clauses WHERE qu'une seule fois.

Alan Storm
la source
8

Depuis Magento 1.9.0. vous pouvez le faire sans toucher à aucun fichier principal.

Vous pouvez observer deux nouveaux événements:

  • sitemap_categories_generating_before
  • sitemap_products_generating_before

Pour exclure des produits en fonction d'un attribut, vous pouvez procéder comme suit:

  1. ajouter un observateur à 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);
    }
  2. ajouter un attribut de produit "oui / non" nommé use_in_sitemap(peut-être la valeur par défaut "oui")

  3. ajouter cet attribut à tous les jeux d'attributs
  4. définissez les produits que vous souhaitez exclure sur "non"
  5. générer votre plan du site

Remarque : jusqu'à Magento 1.9.3.0, l'attribut doit être défini sur globalscope.

sv3n
la source
3

Pour ce faire, vous pouvez procéder comme suit::

  1. Créez un attribut par rapport au produit, c'est-à-dire exclude_from_sitemap(Oui / Non)

  2. Écraser la Mage_Sitemap_Model_Resource_Catalog_Productclasse et modifier la getCollectionfonction en ajoutant un filtre à votre nouvel attribut, c'est-à-dire exclure du plan du site

Si vous n'êtes pas développeur, le module suivant peut vous aider à atteindre ce qui précède, mais bien sûr, c'est une extension payante

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

stevensagaar
la source
1

Vous pouvez désactiver ces produits ou définir le champ de visibilité sur «Non visible individuellement». Dans le plan du site, seuls les produits visibles et activés sont répertoriés.
Si vous avez besoin de ces produits, désactivez-les, créez sitemap.xml et réactivez-les.

Marius
la source