製品ストアビュースコープURLキー付き404ストアスイッチ
-
16-10-2019 - |
質問
デフォルトで URL Key
製品ページにはグローバルスコープがあります。
編集:Florinelchisで示唆されているように、範囲は属性の管理の変更です。ただし、これにより、ストアビュースイッチャーの動作が壊れます。
これは、サンプルデータを使用して1.7.0.2でテストされています。 「Store CodeをURLに追加」有効にします:
- 製品を編集し、特定のStoreView(フランス語)に別のURLを設定します
- 再インデックス
- 英語の店舗ビューのサイトで製品ページを開く
- フランス語に切り替える:ページURLがコンタビングする
/French/
英語に戻る - > 404ページのエラー(URLはストアコードを見逃しています
/default/
ストアビュー/言語スイッチで正しく機能させる方法は?
詳細:
- 英語のURL:
/default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
- フランス語のURL:
/french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
このページで英語のサイトにいる場合 - > /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
それから私はフランス語に切り替えます:
私はこのURLを手に入れました(ストアコードが見逃されています):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
そのため、MagentoはURLを正しく書き直しましたが、何らかの理由でストアコードを見逃します
参照:
確かにこれはに関連しています /core/model/store.php
と /core/model/url/rewrite.php
, 、、特にそれらの方法に:
Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl
アップデート
1.9.1 @vinaiの修正が機能しない場合は、追加した新しい回答を確認してください
解決 3
Magento 1.9.1のいくつかの更新情報
とにかく、このバージョンで解決されたバグ@vinaiは、他の理由でこのバージョンで解決されたルックスを指摘しました(構成可能な製品の場合)
問題の本当の問題はおそらくここにあります Mage_Catalog_Model_Resource_Url
しかし、私には時間がありませんし、コアのそのような繊細な部分に触れたくありません。
回避策の説明:
エントリポイントは常にこのクラスですMage_Core_Model_Url_Rewrite_Request
特に方法 _rewriteDb()
どのように _rewriteDb()
作品:
- まず、現在のストアのリクエストをロードしようとします
(139): $this->_rewrite->loadByRequestPath($requestCases);
- それから私がそれを見つけることができない場合(IDなし)そして
___from_store
パラメーター
(142): if (!$this->_rewrite->getId() && $fromStore) {
- の書き込みをロードしてみてください
___from_store
:
(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
- それが見つかった場合、それは使用します
id_path
現在のストアに1つをロードするには:
(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
すべてがうまく見えますが、url_rewriteデータには問題があるため、インデックス機能(少なくとも構成可能な製品の場合)があります。
- ストアを切り替えていて、新しいストアに異なるURLがあり、139行目の書き換えがロードされています。
問題は、この書き直しが間違っていることを指し示すことです id_path
(構成可能な製品IDを指す代わりに、その単純な製品IDの1つを指しています)
これで回避策は、を削除することです !$this->_rewrite->getId()
状態とマゼントは、常にリダイレクトを見つけようとします $fromstore
パラメーター
- 最善は修正することです
catalog_url
作成する間違った書き換えをインデックスして削除します。
ここで、高速回避策のコードを使用します(モジュールを作成して書き直す必要があります Mage_Core_Model_Url_Rewrite_Request
あなた自身のクラス):
protected function _rewriteDb()
{
if (null === $this->_rewrite->getStoreId() || false === $this->_rewrite->getStoreId()) {
$this->_rewrite->setStoreId($this->_app->getStore()->getId());
}
$requestCases = $this->_getRequestCases();
$fromStore = $this->_request->getQuery('___from_store');
if ($fromStore) {
$stores = $this->_app->getStores(false, true);
if (!empty($stores[$fromStore])) {
/** @var $store Mage_Core_Model_Store */
$store = $stores[$fromStore];
$fromStoreId = $store->getId();
} else {
return parent::_rewriteDb();
}
$this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
if (!$this->_rewrite->getId()) {
return parent::_rewriteDb();
}
// Load rewrite by id_path
$currentStore = $this->_app->getStore();
$this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
$this->_setStoreCodeCookie($currentStore->getCode());
$targetUrl = $currentStore->getBaseUrl() . $this->_rewrite->getRequestPath();
$this->_sendRedirectHeaders($targetUrl, true);
}
if (!$this->_rewrite->getId()) {
return parent::_rewriteDb();
}
$this->_request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
$this->_rewrite->getRequestPath());
$this->_processRedirectOptions();
return true;
}
他のヒント
問題は、モデルのバグです Mage_Core_Model_Url_Rewrite_Request
(Magento 1.8)と Mage_Core_Model_Url_Rewrite
(以前のバージョン)。
1.8のコアコードのセクションは次のようになります。
// Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()
$fromStore = $this->_request->getQuery('___from_store');
if (!$this->_rewrite->getId() && $fromStore) {
$stores = $this->_app->getStores();
if (!empty($stores[$fromStore])) {
$store = $stores[$fromStore];
$fromStoreId = $store->getId();
} else {
return false;
}
バグ:クエリパラメーターの値はストアコードです(私の場合、 de
, en
また fr
)。返された配列のキー app->getStores()
です 数値 IDを保存します。それが理由です if (!empty($stores[$fromStore])) {
常に失敗します。
そのバグが修正されると、同じ方法で別のバグが明らかになります(1.8でのみだと思います):
$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();
リクエストオブジェクトベースURLは常にMagento Base_urlです。 それなし ストアコード。使用 $currentStore->getBaseUrl()
代わりに、そのバグも修正します。
これらの2つの問題が修正されると、言語スイッチャーは正常に動作します。これは、Magento 1.8(CE)の拡張機能を正確に行う拡張機能です。 https://github.com/vinai/vinaikopp_storeurlrewrites
Magento 1.7では、問題は何か違うかもしれません。 Googleが1.8以降を実行している他の誰かをここに連れてきた場合に備えて、私はまだこの答えを追加すると思いました。
実際、Magento 1.7.0.2でこの問題の回避策を見つけました。
問題の一部はリクエストコントローラーに関連しているようです Mage_Core_Controller_Request_Http
.
161行目を見ると、この状態があります。
elseif ($storeCode !== '') {
$this->setActionName('noRoute');
}
コメントすると、カテゴリ/製品ページの別のストアに切り替えると、404エラーを修正します。
ただし、何らかの未知の理由で、しばらくの間、ストアコードが応答URLで見逃されますが、これは両方のURLが機能しているため、これはもう問題を引き起こしていません。
- Magedomain/Sony-Vaio-Vgn-TXN27N-B-11-1-NOTEBOOK-PC-FRENCH.HTML
- Magedomain/Sony-Vaio-Vgn-TXN27N-B-1-1-1-NOTEBOOK-PC.HTML
この条件のコメントが他の問題を引き起こす可能性があるかどうかは私には明確ではありません
URLキー 属性です。編集できます。 カタログ - >属性 - >属性を管理します。検索する url_key クリックしてください。
変更 範囲 そして保存します。
これで、各ストアビューに製品用の異なるURLキーを使用できます。
それで、あなたは各ストアビューのURLを変更したいですか?
現在、あなたはあなたのフランスの店があなたの英語の店とは異なるためにスコアスコープで製品URLを変更しましたか?そして、2つを切り替えると、404を取得します。これは、予想される動作になります。
Magentoは、他のストアビュー用に異なるURL書き換えを保存しません。だからあなたがヒットするとき /french/product1
フランスの店では、URLがテーブルで一致し、ロードされます。しかし、英語の店でヒットすると、一致しないため、404になります。
必要なように聞こえるのは、「ストアコードをURLに追加する」ことだけです。これにより、URLキーのみが残りますが、それぞれすべてのURLにストアコードを接頭します。これにより、ストアスイッチャーが機能するようになります。