Magento PWA コンテンツ ステージングでキャンペーンをプレビューできませんか? 修正方法は次のとおりです
公開: 2023-05-24Magento PWA コンテンツ ステージングでキャンペーンをプレビューするときに問題が発生していますか? 心配しないでください。 このブログ投稿では、キャンペーンをプレビューできないという一般的な問題を調査し、それを修正するための段階的な解決策を提供します。 私たちの専門家によるガイダンスにより、Magento PWA でのコンテンツ ステージングの可能性を最大限に引き出し、コンテンツの更新をシームレスにプレビューしてスケジュールできるようになります。 飛び込んでみましょう!
Magento Commerce コンテンツのステージング
コンテンツステージングとは何ですか?
コンテンツ ステージングは、Magento Commerce (Adobe) が提供する強力な機能で、ビジネス チームが管理インターフェイスから直接、オンライン ストアの幅広いコンテンツ更新を簡単に作成、プレビュー、スケジュールできるようにします。
コンテンツステージングの主な機能
- 柔軟なスケジュール設定:コンテンツ ステージングを利用することで、特定の期間におけるストアのコンテンツの変更をスケジュールできます。 スケジュールされた変更の有効期限が切れると、コンテンツは自動的に前のバージョンに戻ります。 これにより、Web サイトが常に最新の状態に保たれ、必要な変更が適切なタイミングで反映されます。 さらに、ベースライン コンテンツの複数のバージョンを作成して、将来の更新を容易にし、以前のバージョンに簡単に移動することができます。
- キャンペーン管理:コンテンツ ステージングにおける「キャンペーン」とは、カレンダーまたはタイムラインで表示できる、スケジュールされた変更の記録されたセットを指します。 ステージング ダッシュボードを使用すると、これらのキャンペーンを効果的に管理でき、スケジュールされたすべての更新の概要が表示されます。 「スケジュールされた更新」とも呼ばれる各スケジュールされた変更は、キャンペーン内の個々の変更を指します。
使い方
- ベースライン コンテンツの確立:ベースライン コンテンツは、キャンペーンのないアセットのデフォルト状態を表します。 これには、ページ上部の「予定されている変更」セクションの下にあるすべてのコンテンツが含まれます。 変更が予定されている進行中のキャンペーンがタイムライン上で重ならない限り、ベースライン コンテンツはアクティブなままになります。
- 最初のキャンペーンの開始:希望の開始日と終了日を指定して、最初のキャンペーンを作成します。 期限のないキャンペーンの場合は、終了日を空白のままにします。 最初のキャンペーンが終了すると、元のベースライン コンテンツが自動的に復元されます。
- 後続のキャンペーンの追加:追加のキャンペーンを作成し、それぞれを固有の期間に割り当てることができます。 ただし、同じアセットのキャンペーンが重複しないようにしてください。 これにより、必要に応じて複数のキャンペーンに対応できます。
- ベースライン コンテンツの復元:すべてのアクティブなキャンペーンが終了日に達すると、ベースライン コンテンツが自動的に復元され、キャンペーン終了後のシームレスな移行が可能になります。
Magento Commerce コンテンツ ステージングの機能を活用することで、コンテンツ更新を正確に制御できるようになり、オンライン ストア全体のユーザー エクスペリエンスを中断することなく、タイムリーな変更を確実に行うことができます。
Magento PWA でのコンテンツ ステージングの制限
残念ながら、Magento PWA (プログレッシブ Web アプリケーション) のコンテンツ ステージングの特定の側面には互換性の問題があり、特定の解決策が必要です。
よく発生する問題の 1 つはキャンペーン プレビュー モードに関連しており、キャンペーン内のコンテンツの変更をプレビューしようとするとエラーが発生する可能性があります。
この記事では、カテゴリ、カタログ価格ルール、カート価格ルール、CMS ページ、CMS ブロックなどの他のコンテンツ タイプにも同様のソリューションを適用できることを理解した上で、主に製品コンテンツのステージングについて説明します。
ご存知かもしれませんが、Magento バックエンドでのコンテンツ ステージングは iframe に依存してプレビュー コンテンツを表示します。 元のプレビュー URL 構造には、preview_store、preview_url、 preview_version という 3 つの必須要素が含まれています。
たとえば、製品に変更が加えられ、次のプレビュー URL が生成された次の例を考えてみましょう。
URL コンポーネントの内訳:
- プレビューストア: 番目
- プレビュー URL: https://demo-enterprise.tigrendev.com/catalog/product/view/id/1
- プレビュー バージョン: 1684578000
ただし、次の問題により、これらの URL は PWA ストアフロントでは意図したとおりに機能しません。
- ルートがありません: PWA ストアフロントの「catalog/product/view/id/1/」にアクセスしようとすると、この特定の URL に定義されたルートがないため、404 Not Found ページが表示されます。
- データ取得の課題: PWA ストアフロントのデータ取得プロセスは、GraphQl クエリに依存しています。 残念ながら、このシナリオでは、クエリに必要なデータを利用できません。
- 認証キーの要件: GraphQl API 経由で製品データにアクセスするには、認証キーが必須です。 このキーは認証と認可の両方の目的に使用され、必要な製品情報を取得できるようになります。
- 一貫性のないデータ取得:現在、API を介してデータを取得すると、ステージング データではなく実際のデータが返されます。 ステージング データを取得するには、API リクエスト内で希望のプレビュー バージョンを指定することが重要です。
これらの問題に対処することで、Magento PWA でのコンテンツ ステージングのシームレスな統合への道が開かれ、一貫したプレビュー エクスペリエンスが確保され、ストアフロント全体のさまざまなコンテンツ タイプの効果的なコンテンツ管理が可能になります。
キャンペーンプレビューモードエラーを解決する方法
この問題を解決するために実行できる手順は次のとおりです。
ステップ 1: プレビュー URL を処理する
- プレビュー URL のカスタマイズを可能にするプラグインを作成します。
<type name="Magento\Staging\Model\Preview\UrlBuilder"> <plugin name="url_builder" type="Tigren\StagingGraphQl\Plugin\Magento\Staging\Model\Preview\UrlBuilder" /> </type>
- Magento のトークン生成機能を利用すると、管理者ユーザーを使用してトークンを生成し、URL に管理者認証キー パラメーターを含めることができます。 これにより、コンテンツをプレビューするための適切な認証と認可が保証されます。
<?php /* * @author Tigren Solutions <[email protected]> * @copyright Copyright (c) 2023 Tigren Solutions <https://www.tigren.com>. All rights reserved. * @license Open Software License ("OSL") v. 3.0 */ namespace Tigren\StagingGraphQl\Plugin\Magento\Staging\Model\Preview; use Magento\Store\Model\StoreManagerInterface; use Magento\Store\Model\ScopeInterface; use Magento\Framework\App\Config\ScopeConfigInterface; /** * Class UrlBuilder * @package Tigren\StagingGraphQl\Plugin\Magento\Staging\Model\Preview */ class UrlBuilder { const PARAM_AUTHORIZATION = 'authorization'; const PARAM_PREVIEW_VERSION = 'preview_version'; const XML_PATH_AUTHORIZATION_USER = 'pwa/preview/authorization_user'; const XML_PATH_AUTHORIZATION_PASSWORD = 'pwa/preview/authorization_password'; /** * @var StoreManagerInterface */ protected $storeManager; /** * @var ScopeConfigInterface */ protected $scopeConfig; /** * @var \Magento\Integration\Model\AdminTokenService */ protected $adminTokenService; /** * @param StoreManagerInterface $storeManager * @param ScopeConfigInterface $scopeConfig * @param \Magento\Integration\Model\AdminTokenService $adminTokenService */ public function __construct( StoreManagerInterface $storeManager, ScopeConfigInterface $scopeConfig, \Magento\Integration\Model\AdminTokenService $adminTokenService ) { $this->storeManager = $storeManager; $this->scopeConfig = $scopeConfig; $this->adminTokenService = $adminTokenService; } /** * @param \Magento\Staging\Model\Preview\UrlBuilder $subject * @param $versionId * @param $url * @param $store * @return array */ public function beforeGetPreviewUrl( \Magento\Staging\Model\Preview\UrlBuilder $subject, $versionId, $url = null, $store = null ) { try { $token = $this->getTokenAdmin(); $newUrl = $url . self::PARAM_PREVIEW_VERSION . '/' . $versionId . '/' . self::PARAM_AUTHORIZATION . '/' . $token; } catch (\Exception $e) { return [$versionId, $url, $store]; } return [$versionId, $newUrl, $store]; } /** * @return string * @throws \Magento\Framework\Exception\AuthenticationException * @throws \Magento\Framework\Exception\InputException * @throws \Magento\Framework\Exception\LocalizedException */ public function getTokenAdmin() { return $this->adminTokenService->createAdminAccessToken($this->getAuthorizationUser(), $this->getAuthorizationPassWord()); } /** * @return mixed */ public function getAuthorizationUser() { return $this->getConfigData(self::XML_PATH_AUTHORIZATION_USER); } /** * @return mixed */ public function getAuthorizationPassWord() { return $this->getConfigData(self::XML_PATH_AUTHORIZATION_PASSWORD); } /** * @param $path * @return mixed */ public function getConfigData($path) { return $this->scopeConfig->getValue($path, ScopeInterface::SCOPE_STORE); } }
- 既存のクエリとの競合を回避するには、特にプレビュー機能を処理するための新しい GraphQL クエリを Magento で作成します。
type Query { product ( preview_version: String authorization: String ): Product @doc(description: "The Product object") }
ステップ 2: PWA ストアフロントをカスタマイズする
- PWA ストアフロントのプレビュー ページに新しいルートを追加します。
route.push({ name: 'ProductPreview', pattern: '/catalog/product/view/id/:id/preview_version/:preview_version/authorization/:authorization', path: 'src/components/ProductPreview' });
- 製品プレビュー コンポーネントの場合、Venia コンポーネントを参照して、同様の製品詳細コンポーネントを構築できます。
- ステージング データを取得するには、新しい GraphQl クエリを使用する必要があります。
import { gql } from '@apollo/client'; import { ProductDetailsFragment } from '@magento/peregrine/lib/talons/RootComponents/Product/productDetailFragment.gql.js'; export const GET_PRODUCT_DETAIL_QUERY = gql` query getProductDetailForPreviewProductPage( $id: Int! $preview_version: String $authorization: String ) { product( id: $id preview_version: $preview_version authorization: $authorization ) { item { id uid ...ProductDetailsFragment } } } ${ProductDetailsFragment} `; export default { getProductDetailQuery: GET_PRODUCT_DETAIL_QUERY };
通常の製品 GraphQL クエリで現在の製品データの代わりにステージング データを取得するには、次の手順に従います。
- Magento_StagingGraphQl モジュールを確認する: Magento_StagingGraphQl モジュールが Magento インスタンスにインストールされ、適切に構成されていることを確認します。 このモジュールは、プレビュー バージョンを使用したステージング データへのアクセスのサポートを提供します。
- リクエスト ヘッダーに認証キーとプレビュー バージョンを含めます。クエリ パラメーターを使用する代わりに、プレビュー バージョンをリクエスト ヘッダーから取得する必要があります。 GraphQL API 呼び出しを行うときに、管理者認証キーとプレビュー バージョンの両方をリクエスト ヘッダーに含めます。
- リクエスト ヘッダーに認可キーを設定する: 管理者認可キーを認可トークンとしてリクエスト ヘッダーに追加します。 これにより、ステージング データにアクセスするための適切な認証と認可が保証されます。
- リクエスト ヘッダーにプレビュー バージョンを設定する: 適切なヘッダー キーと値を使用して、リクエスト ヘッダーにプレビュー バージョンを含めます。 これは、指定されたプレビュー バージョンに対応するステージング データを取得するように Magento に指示します。
リクエスト ヘッダーに認証キーとプレビュー バージョンを含めることにより、GraphQL API 呼び出しは現在の製品データの代わりに必要なステージング データを取得します。
ステップ 3: プレビュー GraphQl をカスタマイズする
- app/code/Tigren/StagingGraphQl/etc/graphql/di.xmlファイルのsupportedQueriesに新しいクエリを追加する必要があります。
<?xml version="1.0"?> <!-- ~ @author Tigren Solutions <[email protected]> ~ @copyright Copyright (c) 2023 Tigren Solutions <https://www.tigren.com>. All rights reserved. ~ @license Open Software License ("OSL") v. 3.0 --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\StagingGraphQl\Plugin\Query\PreviewResolver"> <arguments> <argument name="supportedQueries" xsi:type="array"> <item name="product" xsi:type="string">product</item> </argument> </arguments> </type> </config>
- 最後に、 @magento/peregrine/lib/talons/AdapterディレクトリにあるuseAdapter.jsファイルを、提供されたコードで更新します。
const authLink = useMemo( () => setContext((_, { headers }) => { // get the authentication token from local storage if it exists. const token = storage.getItem('signin_token'); // return the headers to the context so httpLink can read them return { headers: { ...headers } }; }), [] );const authLink = useMemo( () => setContext((_, { headers }) => { const token = storage.getItem('signin_token'); const operationName = _.operationName; if (operationName === 'getProductDetailForPreviewProductPage') { const variables = _.variables; if (variables.preview_version !== undefined && variables.authorization !== undefined) { const previewVersion = variables.preview_version; const authorization = variables.authorization; return { headers: { ...headers, authorization: 'Bearer ' + authorization, 'preview-version': previewVersion } }; } } return { headers: { ...headers } }; }), [] );
このコードは、操作名が「getProductDetailForPreviewProductPage」であるかどうかを確認する条件を追加します。 条件が満たされ、必要な変数 (preview_version および authorization) が存在する場合、ヘッダーはそれに応じて更新されます。
これらのコード変更を行った後、PWA を再構築して更新を組み込んでください。
GraphQL リクエストに必要なヘッダーを含めることで、このソリューションを適用して PWA 内の他のステージング コンテンツを更新できるようになりました。
最後の言葉
Content Staging でキャンペーンをプレビューできないことは、Adobe Commerce PWA ストアを管理する際にイライラする障害となる可能性があります。 ただし、このブログ投稿で提供される知識と解決策があれば、この問題を克服し、コンテンツ ステージングの可能性を最大限に活用するためのツールが手に入ります。
段階的な手順に従うことで、プレビュー URL をカスタマイズし、PWA ストアフロントをカスタマイズし、ステージング データを確実に取得してシームレスなプレビュー エクスペリエンスを実現できます。 コンテンツの更新を正確にプレビューしてスケジュールできる機能により、自信を持ってオンライン ストアのユーザー エクスペリエンスを向上させ、コンバージョンを促進できます。
関連記事:
Magento PWA の構築にはどのくらい時間がかかりますか?
Magento 2 に適切な PWA テーマを選択する方法
Magento PWA 開発ライフサイクルの 7 つのフェーズ
今後概説される Magento PWA 開発トレンド