So richten Sie dynamische SEO-URLs in Shopware ein

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

Your email address will not be published. Required fields are marked *