Sitemap manipulieren

Hallo :slight_smile:

ich möchte über einen Eventhook die Menge der in der Sitemap angezeigten Artikel ändern, genauer gesagt möchte ich bestimmte Artikel nicht anzeigen. Welches Event muss ich dafür Subscriben?

Vielen Dank

Willst du das per Plugin lösen?
Über die Config.php geht das schon so: https://forum.shopware.com/discussion/comment/243502/#Comment_243502

Hi,

ja das wüsste ich auch gerne. Auch ich möchte wie viele andere hier im Forum die möglichkeit haben gewisse SEO ausgaben per Attributfeld zu  manipulieren. Es geht auch bei uns ion mehreren Shop um den bereits oft genannten Fall: noindex,follow per attributfeld zu setzen. 

Ich habe bis Shoipware 5.5 hier ein einfaches Plugin genutzt welches mir die Attributfelder im Theme im Sitemap bereich nachliefert. so konnte ich nun ohne weitere Probleme die sitemap_mobile_xml anpassen und die sitemap_xml natürlich auch. Beim neuen Weg geht das nun nichtmehr bzw ist allgemien die einflussnahme bescheiden. Es gibt sehr sehr viele Anwendungen bei denen gewisse SEO META Daten auf gewissen Seiten nicht irgendwelchen regulären Wegen folgen können. Pasuchal alle Hersteller zu entfernen dagegen sehe ich eher als nutzloses nice-to-have an.

Der andere Punkt, die detaillierte Einflussnamne, ist viel wichtiger - wie es ja auch in vielen anderen Posts hier im Forum zu sehen ist. Ich möchte hier nicht von verschlimmbesserung sprechen den es sind ja durchaus auch gute features dazugekommen und die google konformität ist jetzt perfekt. Aber die Einflussname muss auf einem möglichst sinnvollen, reproduzierbaren (am besten Theme seitigen) wieder möglich werden.

Am ende ist es sonst so das immer alles gut ging und jetzt wo es verbessert wurde muss man ein plugin einsetzen was die ganze nuee tolle implementioerung wieder zunichte macht. 

 

Ein schneller Ansatz wäre sehr schön da es sonst wieder zu updatestops führen wird.

 

Vielen Dank & viele Grüße

Du erstellst eine neue Klasse die von FilterInterface erbt https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Bundle/SitemapBundle/UrlFilter/FilterInterface.php

Den registrierst du im DI mit den Tag shopware.sitemap.url_filter

Hi,

 

super Danke für den Hinweis. Das werde ich mir aufjedenfall zeitnah ansehen.

 

Viele Grüße

[@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski „Moritz Naczenski“)‍ nein, das ist leider nicht, was ich meine. In meinem Fall kenne ich die Artikel nicht explizit in dem Moment, in dem ich das Plugin schreibe. Es handelt sich allerdings um Artikel, die immer in einer Kategorie sind, die ich kenne. Ich möchte eben diese, die aber irgendwann im Verlauf der Shopnutzung später erst entstehen, von der Anzeige in der sitemap ausschließen.

@lorenz‍, wenn du noch etwas dazu sagen könntest, wäre das sicher auch hilfreich.

Ich habe mir übrigens das hier angesehen, es funktioniert allerdings nicht. die notify Funktion wird irgendwie nie aufgerufen:

https://gordonlesti.com/create-a-list-of-notified-events-in-shopware-5/

Vielen Dank

Ich habe jetzt einige Zeit rumgestochert und herausgefunden, dass ich in der Datei 

shopware\engine\Shopware\Bundle\SitemapBundle\Controllers\Frontend\SitemapIndexXml.php

diese Abfrage entfernen kann:

//if ((empty($sitemaps) || time() > $refreshInterval + $lastGenerated) &&
//$this->get('config')->get('sitemapRefreshStrategy') === SitemapExporterInterface::STRATEGY_LIVE) {
    ...
//}

, sodass der Code dazwischen in jedem Fall ausgeführt wird. Das führt dazu, dass die Sitemap immer generiert wird, wenn man im Browser die Adresse www.url.de/sitemap_index.xml aufruft. Wenn man dann im Plugin die folgenden Events subscribt, werden die Funktionen ausgeführt:

public static function getSubscribedEvents()
    {
        return [

            'Enlight_Bootstrap_AfterInitResource_shopware_bundle_sitemap.service.url_filter' => 'x',
            'Enlight_Bootstrap_InitResource_shopware_bundle_sitemap.service.filter_container_factory' => 'x',
            'Enlight_Bootstrap_InitResource_shopware_bundle_sitemap.service.url_filter' => 'x',
            'Enlight_Bootstrap_InitResource_shopware_bundle_sitemap.url_filter.product' => 'x',
            'Enlight_Bootstrap_InitResource_shopware_bundle_sitemap.provider.url.product' => 'x',
        ];
    }

public function x(\Enlight_Event_EventArgs $arguments){dump($arguments);}

Die Ausgabe der Variable $arguments bringt mich allerdings nicht weiter. Die sieht immer z.b. so aus:

Enlight_Event_EventArgs {#1577 ▼
  #_processed: false
  #_name: "Enlight_Bootstrap_InitResource_shopware_bundle_sitemap.provider.url.product"
  #_return: null
  #_elements: array:1 [▼
    "subject" => ShopwareProduction5212a41d20223758a4818c780415e2df77f455b8ProjectContainer {#90 …20}
  ]
}

Ich habe noch herausgefunden, dass in dieser Datei:

shopware\engine\Shopware\Bundle\SitemapBundle\Service\UrlFilter.php

es so aussieht, also könne man irgendwie Filter definieren, um die am Ende zurückgegebene Menge an urls zu manipulieren. Ich weiß aber nicht, wie man das macht. Auf jeden Fall ist in der Variable $urls in der Mitte genau die Liste der Produkte drin, die ich verändern will. (es wird in der Mitte bereits returnt, weil keine Filter definiert sind:

// Check if no filters exist at all
if (!$filters) {
    return $urls;
}

)

Wie kann man aus der Sitemap eigentlich die Artikellinks komplett rausnehmen? 

Wir würden die Sitemap gerne nur mit den Kategorien aufbauen.

Ich habe jetzt in Ansätzen verstanden, was @Shyim‍ warscheinlich meint. Ich habe also meine Datei PluginName/Resources/services.xml so aufgebaut:

Dann habe ich die Datei PluginName/Components/Sitemapfilter.php so angelegt:

Ich kann nun überall meine Klasse instanziieren:

$smf = Shopware()->Container()->get('plugin_name.sitemapfilter');

Das alles verstehe ich so, dass ich mir auf diese Weise jetzt eben Funktionalität in meiner neuen Klasse definieren kann, die ich dann irgendwo anwenden kann. Was ich nicht verstehe ist allerdings, wie ich das ganze nun tatsächlich als Filter für die Menge an Produkten in der Sitemap verwende. Nur das, was ich jetzt geschrieben habe, führt nicht dazu, dass Shopware jetzt meine Klasse irgendwie nutzt, denn dann würde ich ja meine dump()-Ausgaben sehen. Das ist nicht der Fall. So gesehen bringt es mir also recht wenig.

@MrFrox‍

aber habe ich richtig verstanden, dass man im Theme selber gar nicht mehr die Sitemap anpassen kann?
Ich dachte es würde ausreichen, wenn man angenommen komplett auf Artikel verzichten möchte, dass man die wie folgt macht:

in der sitemap_mobile_xml
 

{strip}
    {block name="frontend_sitemap_mobile_xml_homepage"}
        {include file="frontend/sitemap_mobile_xml/entry.tpl" urlParams = ['controller' => 'index']}
    {/block}

    {block name="frontend_sitemap_mobile_xml_categories"}
        {foreach $sitemap.categories as $category}
            {if $category.show}
                {include file="frontend/sitemap_mobile_xml/entry.tpl" urlParams = $category.urlParams lastmod = $category.changed}
            {/if}
        {/foreach}
    {/block}

    {block name="frontend_sitemap_mobile_xml_articles"}
    {/block}

    {block name="frontend_sitemap_mobile_xml_blogs"}
        {foreach $sitemap.blogs as $blog}
            {include file="frontend/sitemap_mobile_xml/entry.tpl" urlParams = $blog.urlParams lastmod = $blog.changed}
        {/foreach}
    {/block}
    {block name="frontend_sitemap_mobile_xml_custom_pages"}
        {foreach $sitemap.customPages as $customPage}
            {if $customPage.show}
                {include file="frontend/sitemap_mobile_xml/entry.tpl" urlParams = $customPage.urlParams lastmod = $customPage.changed}
            {/if}
        {/foreach}
    {/block}
    {block name="frontend_sitemap_mobile_xml_suppliers"}
        {foreach $sitemap.suppliers as $supplier}
            {include file="frontend/sitemap_mobile_xml/entry.tpl" urlParams = $supplier.urlParams lastmod = $supplier.changed}
        {/foreach}
    {/block}
    {block name="frontend_sitemap_mobile_xml_landingpages"}
        {foreach $sitemap.landingPages as $landingPage}
            {if $landingPage.show}
                {include file="frontend/sitemap_mobile_xml/entry.tpl" urlParams = $landingPage.urlParams lastmod = $landingPage.0.modified}
            {/if}
        {/foreach}
    {/block}
{/strip}

Dort habe ich einfach:

    {block name="frontend_sitemap_mobile_xml_articles"}
    {/block}

leer gelassen, ich weiss es hat nicht ganz was mit Deinem Thema zu tun, denn so wie ich Dich verstanden habe willst Du noch eine Abfrage aus den Attributen nutzen um ggf. einen Artikel auszublenden - wie aber eine komplette Ausblendung realisieren? 

 

 

Hey @n8lauscher‍,

das geht seit 5.5 nicht mehr.

 

@MrFrox

Die Filter werden jeweils ausgeführt, wenn die Sitemap generiert wird.

@n8lauscher‍ ich möchte die Artikel, die sich in einer von mir festgelegten Kategorie befinden von der sitemap ausschließen. Selbst, wenn es durch die Veränderung des Templates möglich ist, denke ich, dass man es nur dadurch nicht hinbekommt.

@Shyim‍ wie gesagt, es passiert nichts. Die Funktion dump() würde mir etwas in eine Datei schreiben, sobald sie ausgefürt wird. So wie ich es oben beschrieben habe, passiert das allerdings nicht. Um sicher zu stellen, dass die Sitemap auch wirklich neu erstellt wird, lösche ich jedes mal die Datei: shopware/web/sitemap/shop-1/sitemap-1.xml.gz , nachdem ich dann die Seite www.url.de/sitemap.xml aufrufe, wird diese Datei neu erstellt, meine dump()-Ausgaben finden allerdings nicht statt. Aus diesem Grund gehe ich davon aus, dass die Funktionen Sitemapfilter::supports und Sitemapfilter::isFiltered auch nicht aufgerufen wurden. 

Muss man evtl. den Service so schreiben?

…um damit dann shopware.sitemap.url_filter irgendwie zu überschreiben? ich verstehe es einfach nicht. Ich versuche es jetzt ununterbrochen seit Freitag Abend. :(((

@n8lauscher schrieb:

Wie kann man aus der Sitemap eigentlich die Artikellinks komplett rausnehmen? 

Wir würden die Sitemap gerne nur mit den Kategorien aufbauen.

Steht in meinem Link oben, kann man jetzt per config.php. 

1 „Gefällt mir“

[@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski „Moritz Naczenski“)‍ Aber so kann man nicht definieren, dass die Artikel einer bestimmten Kategorie außen vor bleiben sollen, oder?

 

Das ganze kommt mit wie ein ultra profanes Problem vor aber es ist mir nicht möglich herauszufinden, wie man die Lösung in Shopware formuliert :frowning:

Hi MrFox,

ich hab dazu ein Plugin erstellt:

https://store.shopware.com/detail/index/sArticle/165960

Kannst du das mal testen?

Gruß Heiner

2 „Gefällt mir“

@h_lohaus‍ WOW, vielen lieben Dank :slight_smile: Ich teste es, sobald ich nachher wieder am Rechner bin. Ich habe jetzt erstmal einen Zahnarzttermin. :confused:

Edit:

Dein Plugin macht genau, was es soll. Ich bin nun dabei, dein Plugin zu verstehen. Ich denke, es wird mir auf jeden fall bei meinem Problem helfen. Vielen Dank :slight_smile:

@MrFox Was willst du den noch dran machen? Kannst ja gerne ein PullReuqest machen oder ich erweitere es noch bevor es in den Store kommt.

Gruß Heiner

@h_lohaus‍ ich habe meinen Task mit deiner Hilfe jetzt erledigen können. Ich habe genau die richtigen dinge in deinem Plugin gefunden und konnte alles in mein Plugin integrieren. In meinem Shop werden durch Userinteraktionen stetig neue Artikel generiert. Diese möchte ich aber von der darstellung in der Sitemap ausschließen, da sie sonst von Google indiziert werden würden. Sie sind nur temporär vorhanden.

@h_lohaus schrieb:

@MrFox Was willst du den noch dran machen? Kannst ja gerne ein PullReuqest machen oder ich erweitere es noch bevor es in den Store kommt.

Gruß Heiner

Hallo Heiner,

im Prinzip fehlen ja nur noch Freitextfelder für die Shopseiten (das wäre wahrscheinlich noch wichtig), die Hersteller und für Landingpages und jeweils eine entsprechende Komponente dafür, dann würde es wirklich alles nötige abdecken. Sonst aber natürlich tolle Arbeit Wink.

Grüße

Sebastian

@h_lohaus‍ Suuuper vielen Dank für deine Hilfe an der Stelle.

Auch ich konnte mit Hilfe deines Plugins als Vorlage alles umsetzen was ich wollte. In meinem Fall ging es um mehrere Shops welche schon seit Jahren die Attributfelder als Robots sperre nutzen. Daher wollte ich nun die alten attr`s weiter verwenden. Ausserdem haben wir dies teils noch mit einer Abfrage und einem Eingabefeld verbunden ala if attrX == noindex. Desweiteren nutzen wir es ausschließlich für Artikelansichten, daher war die Erweiterung auf die Kategorieseiten für uns unnötig.

Wenn ich jetzt dein Pluginansatz hier durcharbeite dann kann ich den Code auch 100% nachvollziehen, aber ich frage mich halt immerwieder wie man zB auf solche Werte kommt:

decorates=„shopware_bundle_sitemap.provider.url.product“

hier fehlt mir noch das Verständnis. Sicher ist ohne solche Hilfstellungen wie jetzt hier von @Shyim‍ wär es noch unglaublich viel schwerer mal zu nem Punkt zu kommen.

 

Vielen Dank nochmal und viele Grüße

 

PS: Eine Sache noch gibt es irgednwo eine Übersicht über die möglichen Vergleichsoperatoren dieser Syntax: ::OPERATOR_EQ ich habe hier alles mögliche versucht wie _NE etc pp aber irgendwie hat nichts richtig gegriffen.