WordPressのリプレイスもどき案件で大量(1,000件以上)のリダイレクトをすることになりそうなので、後の自分のダメージを減らすべく、準備がてらなるべく楽にリダイレクト出来る方法を考えました。
表題の通り 雑に 書いています。取り敢えず目的を果たす為だけにつくりました。
達成したいこと
- 大量のリダイレクトの処理の手間を減らしたい。
目視で1件ずつは勘弁…
- 本番・開発・ローカルでファイルを共有出来る状態にしておきたい。
- サーバーの仕様に影響される
.htaccess
は本番・開発・ローカルで共有したくない。(共有出来ない可能性がある。)
- サーバーの仕様に影響される
- 自分以外の人もリダイレクト元とリダイレクト先の情報が一度に確認出来る状態にしておきたい。
- プラグインを利用した場合、管理画面から1件ずつ確認するのが面倒臭そう。間違いに気付きにくい。
- GoogleDriveなどで表にしておいて、必要な情報のみ抜き出して編集・閲覧出来る状態にしておけば、間違いに気付きやすくなる。
考えた方法
リダイレクト元とリダイレクト先のURLを記載したCSVファイルを作り、リダイレクト用のPHPに変換し、header('Location:...')
を利用してリダイレクト。
今回はリダイレクトの条件の部分の変換を行いました。( header('Location...
を書いてある別ファイルにincludeする前提)
プラグインを使用しなかった理由
- プラグインによっては更新が止まっているものがある(アップデート後に不具合を起こす可能性がある)。
- リダイレクトの設定が
.htaccess
に吐き出されるプラグインは避けたい。- 本番・開発・ローカルで
.htaccess
を使い回すことは避けたい。
- 本番・開発・ローカルで
前提条件
-
Node.js
をインストール済みであること
使うもの
準備
パッケージをインストール
yarn add csv -D
若しくは
npm i csv -D
csvファイルと変換先の空のファイルを用意
csv
-
title
:ページのタイトル -
old
:リダイレクト元のドメインより後のURL -
new
:リダイレクト先のドメインより後のURL
CSVのデータ
title,old,new
Contact,contact,sample-page
りだいれくとのてすと。さんぷるページに移動,19,sample-page
りだいれくとてすと2。プライバシーポリシーにいどう,21,privacy-policy
空のファイル
中身は書かずに hoge.php
で保存
スクリプトを書く
convert-csv.js
で保存
変換用スクリプト
/**
* csvからリダイレクト用のPHPに変換するスクリプト
*/
const fs = require('fs');
const csv = require('csv');
/**
* データをパースする
*/
const parser = csv.parse( { columns: true }, ( error, data ) => {
if ( error ) {
console.error(error);
return;
}
/**
* データからリダイレクト元とリダイレクト先のURLのみ取り出した配列を作成
*/
const redirectUrlArray = data.map((obj) => {
const oldUrl = obj['old'];
const newUrl = obj['new'];
return { oldUrl, newUrl };
});
/**
* リダイレクト元とリダイレクト先の配列を元にPHPのswitch文の中身を作成
*/
const arrayText = redirectUrlArray.map((obj) => {
return ` case home_url('/').'${obj['oldUrl']}/':\n $redirectUrl = home_url('/').'${obj['newUrl']}/';\n break;\n`;
});
/**
* テキストに変換
*/
const outText = arrayText.join(',').replace(/,/g, '');
/**
* PHPファイルの中身
*/
const outputData = `<?php\n switch ($url) {\n${outText}\n }\n?>`;
/**
* ファイルに書き出し
*/
fs.writeFile(__dirname + 'hoge.phpのファイルパス', outputData, (error) => {
if ( error ) {
console.error(error);
return;
}
console.log(outputData);
console.log('変換完了');
});
});
/**
* ファイルの読み込み
*/
fs.createReadStream(__dirname + 'CSVデータのファイルパス').pipe(parser);
実行
convert-csv.js
を保存したディレクトリで以下を実行
node convert-csv.js
実行結果
<?php
switch ($url) {
case home_url('/').'contact/':
$redirectUrl = home_url('/').'sample-page/';
break;
case home_url('/').'19/':
$redirectUrl = home_url('/').'sample-page/';
break;
case home_url('/').'21/':
$redirectUrl = home_url('/').'privacy-policy/';
break;
}
?>
最後の break;
の後に改行が入りますが動作に影響は無いので無視で・・・