UPDATE Im
Folgenden finden Sie die ursprüngliche Frage, die sich zwar auf das Problem bezieht, aber tangential ist. Weitere nützliche Hintergrundinformationen finden Sie in den Änderungen, die mit Nummer 2 beginnen
Auf unserer Website finden Sie einige CMS-Seiten, auf denen die Korrelation zwischen zwei verschiedenen Kategorien erläutert wird. Daher ähneln die URLs in der Regel den URLs der Katalogseiten.
- Ein Beispiel für eine CMS-URL:
- "brand / category.html"
- Die Kategorie, die übereinstimmt:
- "Kategorie"
Gibt es in Magento eine Einstellung, die eine strengere Übereinstimmung der Kategorie-Routen erzwingt?
EDIT: Ich sollte beachten, obwohl es offensichtlich ist: Dies sind nur Beispielnamen
BEARBEITEN 2: Wenn es hilfreich ist, haben alle Katalogseiten URLs relativ zu root (website.com/subcat), wobei subcat ein Kind einer anderen Kategorie ist. Dieses Verhalten unterscheidet sich von der Standardeinstellung in anderen Magento-Installationen. (Hinweis: Dies wird nicht bevorzugt und es ist unklar, warum dies geschieht.)
EDIT 3: Nach mehr Graben fand ich ein Zitat aus einem Artikel von Fabrizio Branca über URL-Schlüssel in 1.13:
Vor 1.13 / 1.8 wurde jede CMS-Seite mit einem URL-Schlüssel, der auch als Kategorie- oder Produkt-URL-Schlüssel verwendet wurde, zuerst ausgewertet. Auf diese Weise können Sie die Hauptkategorien leicht durch cms-Zielseiten ersetzen. Das hat sich jetzt geändert. Obwohl der CMS-Controller zuerst verarbeitet wird, werden die Produkt- und Kategorie-URLs vor Beginn des Routing-Prozesses ausgewertet, was die Anzeige von CMS-Inhalten auf saubere Weise erheblich erschwert.
EDIT 4: Ergebnis weiterer Forschung:
- "legitime Kategorie" existiert und ist standardmäßig unter zugänglich
/a
- "legitime andere Kategorie" existiert ebenfalls und ist bei
b
- Unabhängig von der Beziehung zwischen diesen beiden Kategorien kann auf beide mit dem anderen als übergeordnetem Element zugegriffen werden (
a/b
funktioniert einwandfreib/a
).- Beachten Sie, dass
a/b
Produkte von b undb/a
Produkte von a zeigt
- Beachten Sie, dass
- Allerdings ,
b/b
funktioniert nicht, noch tutnon-existant-category/a
Was ich suche, ist eine URL-Struktur ähnlich den vorherigen Magento-Versionen (IE category/subcategory
), ohne die Vorteile der Hintergrundindizierung zu verlieren, die 1.13 bietet.
website.com/brand/category.html
an die Route anpasstwebsite.com/category
. Meine Frage ist, wie ich das nicht erreichen kann.Antworten:
( Ich dachte, ich hätte eine ähnliche Antwort wie Alan gepostet , aber ich hatte keine. Ich sitze hier in LocalStorage. Aber ich kann seine Antwort mit einer interessanten Lösungstheorie versehen. )
Der CMS-Router fügt sich der Front Controller-Instanz hinzu, indem er das
controller_front_init_routers
Ereignis beobachtet , nachdem der Admin- und der Standard-Router hinzugefügt wurden. Mit ein wenig Config XML, wäre es möglich , dies mit dem wechselncontroller_front_init_before
Ereignis , wodurch das CMS Hinzufügen Router zunächst , seine Bedeutungmatch()
ing Logik wird vor den anderen laufen.Um diese Theorie zu testen, legen Sie Folgendes in app / etc / local.xml ab :
Überprüfen Sie, ob das Problem dadurch behoben wird.
Im Übrigen passt der CMS-Router den Anforderungspfad auf dieselbe Weise an wie das URL-Umschreibemodell.
quelle
frontend
ist richtig verschachtelt alsconfig
->frontend
, ja?Mage::log()
Anruf (oder ein Echo oder was auch immer) beendenMage_Core_Controller_Varien_Action::addRouter()
, um die Reihenfolge anzuzeigen, in der die Router-Klassen hinzugefügt werden.addRouter
Methode nur in sehenMage_Core_Controller_Varien_Front
. Unabhängig davon war die Reihenfolge gemäß der Protokollausgabe: admin, standard, cms, default.Ich habe viele interessante Implementierungen (einige gute, andere schlechte) von SEO-Spezialisten gesehen, die im Laufe der Jahre keinen Magento-Hintergrund hatten. Es hört sich so an, als ob Sie Probleme mit benutzerdefiniertem Code haben, den Sie nicht verstehen. Die allgemeine Antwort auf Ihre Frage lautet möglicherweise "Wenden Sie sich an die Person, die den SEO-Code geschrieben und / oder die Erweiterung installiert hat, die Sie nicht verstehen", oder suchen Sie einen Magento-Berater, der einen Blick darauf wirft und ihn schnell für Sie zerlegt.
Ihre Frage ist trotz ihrer Klärung immer noch zu verwirrend. Im wahrsten Sinne des Wortes gibt es in Magento keine Einstellung, um "das Routing von Kategorien strenger zu gestalten". Ich werde in groben Zügen erklären, wie das Routing von Kategorien im Vergleich zum CMS-Routing in einem Standard-Magento-System funktioniert. Dies gibt Ihnen (hoffentlich) genügend Informationen, um eine neue Frage zu stellen, unter der wir sie verstehen können. Außerdem habe ich bereits ausführlich über den Versand von Magentos Anfragen geschrieben. Wenn Sie also an den wichtigsten Details interessiert sind, würde ich dort beginnen .
Kategorie-Routing
Streng genommen gibt es in Magento kein "Kategorie" -Routing. Auf einer Website mit deaktivierten SEO-freundlichen URLs sieht eine Kategorieliste wie folgt aus.
Wenn SEO-freundliche URLs aktiviert sind, erstellt Magento (in einem Indizierungsprozess) zwischen einem und mehreren Einträgen in der
Tabelle für diese Kategorie. Die
request_path
Spalte ist hier die Importspalte. Wenn Magento entscheidet, wie mit einer bestimmten URL umgegangen werden soll, wird diese zuerst in dieser Tabelle angezeigt. Wenn die aktuelle URL mit der übereinstimmtrequest_path
, ändert Magento die interne Darstellung der URL so, dass sie wie dietarget_path
Spalte aussieht .In den Beispieldaten gibt es also eine Zeile, die so aussieht
Wenn Magento die URL sieht
http://magento.example.com/electronics/cell-phones.html
, stimmt sie mit dieser Zeile überein, da dierequest_path
Variable istelectronics/cell-phones.html
. Anschließend ändert es seine interne Darstellung der URL intarget_path
(catalog/category/view/id/8
). Dann behandelt Magento die URL normal.Das ist wahrscheinlich ein bisschen zu folgen, wenn Sie nicht daran gewöhnt sind, aber das Wichtigste, was Sie mitnehmen sollten, ist das System, das entscheidet, wie mit der URL umgegangen wird. Es ist egal, ob es sich um eine Kategorie-URL handelt, es ist nur wichtig, dass es einen Eintrag gibt in der
core_url_rewrite
Tabelle . Dieselbe Tabelle wird für Produktnamen-URLs verwendet. Viele SEO-Erweiterungen und benutzerdefinierte Codelösungen verwenden diese Tabelle ebenfalls.CMS-Seitenrouting
Nachdem Magento die Referenzierung der
core_url_rewrite
Tabelle abgeschlossen hat, geschieht FolgendesEs wird nach Übereinstimmungen mit Admin-Anwendungsseiten gesucht (Produkte verwalten, Kategorien verwalten usw.).
Es wird nach Übereinstimmungen mit der Frontend-Anwendungsseite gesucht (Produktlistenseite, oben genannte Kategorielistenseite usw.).
Wenn die Nummern 1 und 2 keine Übereinstimmungen enthalten, wird nach einer CMS-Seitenübereinstimmung gesucht.
Magento nicht verwenden , um die
core_url_rewrite
Tabelle für CMS - Seiten. Wenn stattdessen Schritt 3 erreicht ist, wird versucht, die URL mit derURL Key
auf dem CMS-Seitenobjekt festgelegten Menge abzugleichen. (Es wäre genauer zu sagen, dass Magento, wenn es nach einer CMS-Seitenübereinstimmung sucht, eine URL verwendet, die bereits durch dencore_url_rewrite
Prozess geändert wurde - aber die Dinge sind bereits verwirrend genug.)Die wichtigsten Aspekte hierbei sind: Der CMS-Abgleich erfolgt erst, nachdem ein Abgleich der Kategorieseiten fehlgeschlagen ist.
Es hört sich so an, als ob externe Prozesse die
core_url_rewrite
Tabelle ändern oder ein benutzerdefiniertes Router-Objekt zu Ihrem System hinzugefügt wird, das zusätzliches Routing ausführt, oder sogar ein Nicht-Magento-System, das Dinge tut, um URLs zu ändern.Ich fürchte, es gibt keine schnelle und einfache Antwort auf Ihre Situation.
quelle
core_url_rewrite
Tabelle genauer ansehen werde ). Ich kann mich von Anfang an daran erinnern, dasssubcategory
dies/subcategory.html
(im Gegensatz zucategory/subcategory.html
) übereinstimmen würde - noch bevor externer Code eingeführt wurde. (\n
) Angenommen, dies hätte früher nützlich sein können, aber ist es möglich, dass es eine Änderung gab in EE 1.13 könnte das dies verursachen?core_url_rewrite
Tisch überprüft . Es ist leer. Könnte dies etwas mit meinen Problemen zu tun haben?Dies ist ein Problem, das ich mir angesehen habe und das bisher keine gute Lösung zu haben scheint. Wir haben einige tief verschachtelte Kategorien, zum Beispiel:
Vor 1.13 wurde die Kategorie-URL als www.domain.com/cat-a/cat-b/cat-c/cat-d/ generiert, jetzt wird sie jedoch als www.domain.com/catd generiert. Wenn Sie mehrere "Cat D" haben, kann dies beispielsweise zu www.domain.com/catalog/category/view/s/cat-d/id/132/ führen.
Ich habe an verschiedenen Ideen herumgebastelt, um dies zu beheben. Ich versuche gerade, die loadByRequestPath-Methode von Enterprise_UrlRewrite_Model_Resource_Url_Rewrite so zu ändern, dass zuerst nach einem vollständigen Pfad gesucht wird, bevor das Standardverhalten verwendet wird. Ich habe das getan, indem ich diese Methode hinzugefügt habe:
und dann diesen Code oben in loadByRequestPath () hinzufügen:
Es scheint zu funktionieren, auf den ersten Blick jedenfalls habe ich es noch nicht sehr gut getestet. Der Nachteil dabei ist, dass der url_key für jede Kategorie manuell auf den vollständigen Pfad gesetzt werden muss, sodass Sie den url-Schlüssel für Cat D auf "cat-a / cat-b / cat-c / cat-d" setzen müssen ". Das ist offensichtlich nicht ideal.
Wie auch immer, das ist wahrscheinlich nicht sehr hilfreich, aber vielleicht hat jemand eine bessere Einstellung zu diesem Ansatz.
quelle
@benmarks Antwort ist schon gut. Sie haben jedoch weiterhin Probleme, wenn Ihre Produkt-URLs mit Ihren CMS-Seiten-URLs übereinstimmen. Die URL-Umschreibungen aus der Tabelle
core_url_rewrite
werden überprüft, bevor die Router überprüft werden - sieheMage_Core_Controller_Varien_Front::dispatch
:Wenn eine Produkt-URL mit den aktuellen
Mage_Core_Model_Url_Rewrite_Request::_rewriteDb
Pfadinformationen übereinstimmt, werden die Pfadinformationen der Anforderung geändert , sodass der CMS-Router nicht mehr übereinstimmt, obwohl er vor dem Katalogrouter aufgerufen wird (wenn Sie @benmarks config.xml angewendet haben). .Zum Glück gibt es eine nette Flagge namens
straight
, die auf a gesetzt werden kannMage_Core_Controller_Request_Http
. Wenn das Flag gesetzt ist, wird das Umschreiben der URL aus der Datenbank nicht überprüft. Daher besteht meine Lösung darin, ein Ereignis zu beobachten, das früh genug ausgelöst wird (controller_front_init_before
), und dasstraight
Flag für die darin enthaltene Anforderung zu setzen, wenn die aktuellen Pfadinformationen mit einer CMS-Seitenkennung übereinstimmen:In Ihrer config.xml:
Ihre Beobachtermethode:
Da der Katalogrouter nicht übereinstimmt, wenn die Datenbank-URL nicht neu geschrieben wird, sollte diese Lösung eigenständig funktionieren und Sie benötigen nicht einmal die Datei config.xml von @benmarks.
Hoffe, das hilft jemandem - das Debuggen hat einige Mühe gekostet!
quelle