So richten Sie dynamische SEO-URLs in Shopware ein
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.
* @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 .
/** * 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 .
/** * 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 .
/** * 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.
/** * 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 .
Leave a Reply