0

サイトのデータベース (Magento ですが、Magento の外部でデータを操作するので関係ありません) に、URL の書き換えでいっぱいのテーブルがあります。このテーブルはかなり前から存在しており、私の URL はその間に複数回変更されています。URLごとに、次のようなものができました。

REWRITES(Request, Target)

really-old-url, old-url
old-url, recent-url
recent-url, current-url

これは期待どおりに動作し、really-old-urlにリダイレクトされますが、 が にリダイレクトされ、さらに にリダイレクトされ、さらに にリダイレクトされた後でcurrent-urlのみ機能します。非常に効率的なセットアップではありません。必要以上の 301 リダイレクトと、ページあたりの db リクエストの増加。最も古い URL と現在の URL の間には 5 つ以上のリダイレクトが存在することが多く、この方法でリダイレクトしているページが何千もあります。really-old-urlold-urlrecent-urlcurrent-url

PHP+MySQL を使用してこのテーブルをループし、次のようにします。

REWRITES(Request, Target)

really-old-url, current-url
old-url, current-url
recent-url, current-url

明らかなように、ページの古い URL のいずれかが要求されるたびに、現在の URL に一度だけリダイレクトされます。

どうすればこれを行うことができますか?

編集 - 他の誰かがまったく同じことをしたい場合に備えて、Magento のフィールド名を使用したゴードンからの正解は次のとおりです。

update core_url_rewrite r join (select r.request_path, r.target_path from core_url_rewrite r left outer join core_url_rewrite r1 on r.target_path = r1.request_path where r1.request_path is null) r2 on r.target_path = r2.request_path set r.target_path = r2.target_path;

編集 #2 - このクエリは行でのみ実行しましたis_system = 0。すべての行を使用すると、予期しない動作が発生する場合があります。

4

1 に答える 1

2

まず、正しいターゲットである一連のターゲットを検討します。リダイレクトがないため、これらは正しいです。

select target
from rewrites r left outer join
     rewrites r1
     on r.target = r1.request
where r1.request is null

ここで、次の更新は、ターゲットが上記のクエリのソースであるレコードを更新することにより、チェーン内の「1 つのリンク」を更新します。

update rewrites r join
       (select r.source, r.target
        from rewrites r left outer join
             rewrites r1
             on r.target = r1.request
        where r1.request is null
       ) r2
       on r.target = r2.source
    set r.target = r2.target;

レコードが更新されなくなるまで、これらの更新を繰り返し続けることができます。

于 2013-06-01T07:40:23.513 に答える