Grüße! Ich bin Aneesh Sreedharan, CEO von 2Hats Logic Solutions. Bei 2Hats Logic Solutions widmen wir uns der Bereitstellung von technischem Fachwissen und der Lösung Ihrer Probleme in der Welt der Technologie. Unsere Blog-Seite dient als Ressource, in der wir Einblicke und Erfahrungen teilen und wertvolle Perspektiven auf Ihre Fragen bieten.
Eine dynamische SEO-URL ist eine URL einer Webseite, die dynamisch aus der Datenbank generiert wird. Es muss sich hin und wieder ändern. Hier besprechen wir, wie wir unsere eigenen SEO-URLs definieren.
Für dieses Szenario können Sie die in Shopware integrierten SeoUrlRoute- Klassen nutzen , die alle notwendigen Informationen über Ihre dynamische Route enthalten.
Schauen wir uns ein Beispiel für den Abschnitt „Geschichten“ an. Jede Story-Seite hat in Bezug auf die Sprache eine andere SEO-URL . Daher muss die SEO-URL je nach Sprache geändert werden .
Zuerst muss eine übersetzbare Entität für Geschichten mit dem Feld seo_url erstellt werden:
Im Folgenden finden Sie den Controller-Pfad für den Zugriff auf die Story-Detailseite im Frontend.
1 2 3 4 5 6 7 8 | * @Route("/story/{id}", name="frontend.story.detail", methods={"GET"}) */ public function storyDetail(Request $request, SalesChannelContext $context, $id): Response { $salesChannelContext = $context->getContext(); $criteria = new Criteria([$id]); */ |
Wie Sie sehen können, hat die Route hier einen ID- Parameter. Wir erhalten die Story- ID anstelle von seo_url und die entsprechenden Storys werden mit der ID abgerufen .
Anschließend wird eine Migration erstellt, um einen Eintrag in die Tabelle seo_url_template einzufügen .
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * Insert y$connection->executeStatement(' INSERT INTO `seo_url_template` (`id`, `sales_channel_id`, `route_name`, `entity_name`, `template`, `is_valid`, `custom_fields`, `created_at`, `updated_at`) VALUES (:id, NULL, :routeName, :entityName, :template, 1, NULL, :createdAt, NULL); ', [ 'id' => Uuid::randomBytes(), 'routeName' => 'frontend.story.detail', 'entityName' => 'stories', 'template' => 'story/{{ entry.seoUrl|lower }}', 'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT), ]); our code here */ |
Anschließend werden SeoUrlRoute- Klassen erstellt , die alle erforderlichen Informationen zu Ihrer dynamischen Route enthalten, und anschließend automatisch die entsprechenden seo_url- Einträge erstellt .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /** * use Shopware\Core\Content\Seo\SeoUrlRoute\SeoUrlMapping; use Shopware\Core\Content\Seo\SeoUrlRoute\SeoUrlRouteConfig; use Shopware\Core\Content\Seo\SeoUrlRoute\SeoUrlRouteInterface; class StorySeoUrlRoute implements SeoUrlRouteInterface { public const ROUTE_NAME = 'frontend.story.detail'; private $definition; public function __construct(StoryDefinition $definition) { $this->definition = $definition; } public function getConfig(): SeoUrlRouteConfig { return new SeoUrlRouteConfig( $this->definition, self::ROUTE_NAME, 'story/{{ entry.seoUrl|lower }}' ); } public function prepareCriteria(Criteria $criteria): void { $criteria->addFilter(new EqualsFilter('active', 1)); } public function getMapping(Entity $entry, ?SalesChannelEntity $salesChannel): SeoUrlMapping { if (!$entry instanceof StoryEntity) { throw new \InvalidArgumentException('Expected StoryEntity'); } return new SeoUrlMapping( $entry, ['id' => $entry->getId()], [ 'entry' => $entry, ] ); } }Insert your code here */ |
Ich werde jeden Schritt im Detail betrachten. Die benutzerdefinierte Klasse „SeoUrlRoute“ muss das SeoUrlRouteInterface implementieren , das die folgenden Methoden enthält
- getConfig()
Hier müssen Sie eine Instanz von SeoUrlRouteConfig zurückgeben . Dann enthält,
- Die Definition Ihrer Entität.
- Technischer Name der zu verwendenden Route.
- Gewünschter SEO-Pfad.
- PrepareCriteria()
Hier können Sie die Kriterieninstanz anpassen, die zum Abrufen Ihrer Entitäten verwendet wird. Sie könnten beispielsweise einen Filter für ein aktives Feld hinzufügen und daher nur SEO-URLs für aktive Entitäten generieren. Außerdem können Sie hier Assoziationen hinzufügen.
- getMapping()
Bei dieser Methode müssen Sie eine Instanz von SeoUrlMapping zurückgeben.
Es muss die tatsächlich verfügbaren Daten für die SEO-URL-Vorlage enthalten. Wenn Sie verwenden
Wenn Sie in der SEO-URL-Vorlage eine Variable „entry.seoURl“ verwenden , müssen Sie hier die Daten für den Schlüsseleintrag angeben .
Im Folgenden finden Sie den Eintrag „services.xml“ für StorySeoUrlRoute. Es muss mit dem Tag shopware.seo_url.route im Container registriert werden .
1 2 3 4 5 6 7 | /** * Insert <service id="Project\Route\StorySeoUrlRoute"> <argument type="service" id="Project\Core\Content\Stories\StoryDefinition"/> <tag name="shopware.seo_url.route"/> </service> your code here */ |
Story-Abonnent
Jedes Mal, wenn Ihre Entität geschrieben wird, müssen wir Shopware mitteilen, dass wir die SEO-URLs für diese Entitäten generieren möchten. Das Gleiche gilt, wenn Ihre Entität gelöscht wird, wir müssen sie ebenfalls aktualisieren. Dies geschieht durch Reaktion auf die DAL-Ereignisse Ihrer benutzerdefinierten Entität. Genauer gesagt verwenden wir das geschriebene Ereignis und das gelöschte Ereignis.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | /** * Insertuse Shopware\Core\Content\Seo\SeoUrlUpdater; use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityDeletedEvent; use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Project\Route\StorySeoUrlRoute; class StorySeoUrlListener implements EventSubscriberInterface { /** * @var SeoUrlUpdater */ private $seoUrlUpdater; public function __construct(SeoUrlUpdater $seoUrlUpdater) { $this->seoUrlUpdater = $seoUrlUpdater; } public static function getSubscribedEvents(): array { return [ 'stories.written' => 'onStoryUpdated', 'stories.deleted' => 'onStoryDeleted', ]; } public function onStoryUpdated(EntityWrittenEvent $event): void { $this->seoUrlUpdater->update(StorySeoUrlRoute::ROUTE_NAME, $event->getIds()); } public function onStoryDeleted(EntityDeletedEvent $event) { $this->seoUrlUpdater->update(StorySeoUrlRoute::ROUTE_NAME, $event->getIds()); } } your code here */ |
Für geschriebene Ereignisse und gelöschte Ereignisse unserer benutzerdefinierten Entität müssen wir den technischen Namen der Entität mit angeben. geschrieben , . Suffix gelöscht . Bei jeder Ausführung verwenden wir lediglich die besagte Update- Methode des SeoUrlUpdater .
Der Abonnent muss für die Nutzung des Containers registriert sein ( services.xml ).
Das folgende Beispiel zeigt die dynamische SEO-URL für eine einzelne Story in englischer und deutscher Sprache sowohl im Backend als auch im Frontend.
Tabelleneinträge für seo_url_template und seo_url
seo_url_template
seo_url
Wenn Sie also den SEO-URL-Pfad (z. B.: story/story-in-english ) im Browser ausführen, checkt Shopware standardmäßig die seo_url- Tabelle ein und das entsprechende Feld path_info (z. B.: / story/78f619ff640e4cf7a5590cb90a290e75 ) wird an den Controller verarbeitet . Und im Controller könnten wir es als Entitäts-ID erhalten .
Wenn Sie also diese Methoden befolgen, können Sie dynamische SEO-URLs in Ihren benutzerdefinierten Entitäten in Shopware ganz einfach verwalten .