カテゴリへの変更が保存されない
この記事では、Commerce管理者を使用して商品カテゴリをアップデートする際に、管理者およびストアフロントに変更内容が表示されないようにする方法について説明します。 問題は、catalog_category_entity テーブルのデータが破損していることが原因です。 この問題を解決するには、テーブル内の問題のあるカテゴリ更新レコードを修正または削除します。 その後、管理者を使用して製品カテゴリを更新できるようになります。
問題
管理者で製品カテゴリに変更を加えて保存すると、新しい更新は保存されず、管理およびストアフロントにも表示されません。
再現手順
- カタログ/カテゴリ に移動します。
- カテゴリを選択します。
- 変更を加え、「保存」をクリックします。
- カテゴリを保存しました というメッセージが表示されます。
- 行った変更は保存されていません。
原因:catalog_category_entity テーブルのデータが破損しています
この問題は、データベース(DB)内の影響を受けるカテゴリレコードの created_in 列に同じ値が含まれていることが原因です。
詳細:
catalog_category_entityDB テーブルには、影響を受けるカテゴリの複数のレコードがあります(これらのレコードのentity_id値は同じです)。- これらのカテゴリレコードには
created_in列の同じ値 があります。
2 つ目の DB エントリ(および次に続くすべての DB エントリ)は、同じカテゴリに対してどのように DB に表示されますか?
影響を受けるカテゴリの 2 つ目の DB レコード(場合によっては次のレコード)は、Category_Staging モジュールを使用してMagentoの更新がスケジュールされていることを意味します。 モジュールは、catalog_category_entity のカテゴリに対して追加のレコードを作成します。これは、想定されるアプリケーション動作です。問題は、レコードの created_in 列の値が同じであるということです。
同じ値はどのように表示されますか?
データ破損の理由を確実に述べることはできません。 考えられる理由は次のとおりです。
- カスタマイズ(コード、テーマなど)
- 誤ったデータ移行
- バックアップからの誤ったデータ復元
私たちの知る限り、このようなデータ破損は、(標準の)「クリーンな」Adobe Commerce インスタンスでは一般的ではなく、カスタマイズを行わずにAdobe Commerce インストールで再現することはできません。
これが問題であることを確認する方法
catalog_category_entity テーブルには、影響を受けるカテゴリの複数のレコード (レコードは同じ entity_id 値である必要があります)と、それらのレコードの少なくとも 2 つが同じ created_in 値である必要があります。 これにより、ステージングスケジュールされた更新はCommerce管理者に表示されず、空の「スケジュールされた変更」ブロックのみが表示されます。
検証の手順
- データベースの catalog_category_entity テーブルにアクセスします。
- entity_id でエンティティをフィルタリングします。entity_id は影響を受けるカテゴリを識別します。
- 同じ entity_id を持つ異なるエントリに対して created_in カラムの値が同じ場合は、この例になります。 通常、
created_inの値はレコードごとに異なります。
解決策
次のいずれかのソリューションを選択できます。
- 削除 問題のあるカテゴリ更新レコード
- 修復 問題のあるカテゴリ更新レコード
問題のあるカテゴリ更新レコードを削除します
このソリューションでは、最初のカテゴリ レコードに正しい updated_in 値を設定し、このカテゴリの他のすべてのレコードを削除する必要があります。 これにより、スケジュールされたすべてのカテゴリの更新が削除されます。
次の手順に従います。
- 影響を受けるカテゴリの
entity_idを含む DB レコードを見つけます。 updated_in列で最大の整数を持つレコードを選択します。- 選択したレコードから
updated_in値をコピーします。 row_id=entity_id(初期カテゴリレコード)のレコードを選択し、コピーした値をこのレコードのupdated_in列に貼り付けます。entity_idに等しくないrow_idを持つ行を削除します。
問題のあるカテゴリ更新レコードの修復
entity_idとcreated_inの値が同じカテゴリ レコードを検索します。row_id=entity_idのレコードを選択し、updated_inの値をコピーします。row_idがentity_idに等しくないレコードを選択し、コピーしたupdated_in値をcreated_in値として貼り付けます。 以下のスクリーンショットを図として参照してください。
- 手順 3 で更新したカテゴリ更新レコードの
created_in値が、staging_updateテーブルに存在することを確認します。 例: コピーされたcreated_in値が 1509281953 の場合、row_id= 1509281953 のエンティティがstaging_updateテーブルに存在する必要があります。