見出し画像

サイト引越し時のリダイレクト用.htacessファイルをプログラムから作成する[WordPress]

WordPressサイトの引越しなどで記事のURLが変わってしまうことがあります。

記事数が少ない場合は手書きで.htaccessファイルを作成してリダイレクトさせますが、記事数が多かったりすると、すべてを手で書くわけにもいきません。

直面した状況
・旧サイトから新サイトに記事を移行したが、パーマリンク構成や記事IDも変わり、記事のURLはまるっと変わっている

・記事の内容自体は変えていないので記事タイトルはそのままである

そこで.htaccssファイルを自動で作成するプログラムを作ることにし
ました。

考えた解決方法

  1. 新旧両サイトで記事データ(記事タイトルとURLからなるCSV)を出力する(プラグイン使用)

  2. CSVファイルの記事タイトルをキーに2サイトの記事を突合し.htaccessファイルを作成するプログラムを作成、実行。

  3. 作った.htaccessファイルを旧サイトに置く


1.新旧両サイトで記事データのCSVを出力する

記事データの出力はプラグインを使うのが早いです。「WP All Export」などのプラグインを使って、記事タイトルURLからなるシンプルなCSVファイルを作成してください。

title,url

プラグインを使わないでCSV出力する方法は下の記事を確認ください。

https://note.com/codingnote/n/n03f2cf872bf9

2.記事タイトルをキーにして新旧サイトの記事を突合し、.htaccessファイルを作成するプログラムを書く

まずサーバー内に以下のような構成のディレクトリを作ります。

  • newsite : 新サイトから取得したCSVファイルを置きます。

  • oldsite : 旧サイトから取得したCSVファイルを置きます。

  • result : ここに2つのCSVファイルを突合した結果の.htaccessファイル出力します。

  • Makehtaccess.php : このファイルにプログラムを書いていきます。


Makehtaccess.phpプログラムを書きます。

<?php
//oldsiteフォルダにあるcsvをすべて読み込み
$oldsite_data = readfiles('./oldsite/');

//newsiteフォルダにあるcsvをすべて読み込み
$newsite_data = readfiles('./newsite/');


//突合・.htaccess文作成
$not_found="";
$htaccess="<IfModule mod_rewrite.c>\n";
$htaccess .="RewriteEngine On\n";

foreach($oldsite_data as $old_value){
    $flg_found = false;
    foreach($newsite_data as $new_value){
        if($old_value['title'] !='Title' ){ //1行目のデータタイトルは無視
            if ( strcmp($old_value['title'], $new_value['title']) == 0 ) {
                $htaccess .="RewriteRule ".$old_value['url']." ".$new_value['url']." [L,R=301]\n";
                $flg_found = true;
                break;
            }
        }
    }
    if (!$flg_found){ //新サイトのCSVファイルに見つからなかった記事はnotfound.csvに書き込む
        $not_found .=$old_value['title'].",".$old_value['url']."\n";
    }
}
$htaccess .="</IfModule>\n";

//htaccessファイル書き出し;
$fp = fopen('./result/htaccess','w');
fwrite($fp,$htaccess);
fclose($fp);

//一致するタイトルが見つからなかった旧サイトの情報を書き出し
$fp = fopen('./result/notfound.csv','w');
fwrite($fp,$not_found);
fclose($fp);


//引数のフォルダにあるCSVファイルをすべて読み込む関数
function readfiles($filepath){
    
    $filelist = glob($filepath . '*');
    $iCnt = 0;
	foreach ($filelist as $file) {
    	$lines = fopen( $file, 'r');
    	while($line = fgetcsv($lines)){
            $csv_data[$iCnt]['title'] = $line[0];
            $csv_data[$iCnt]['url'] = $line[1];
            $iCnt++;
        }
	}
	return $csv_data;
}

プログラムはソースコードを見た通りです。

このファイルを実行すると、旧サイトのURLから新サイトのURLへリダイレクトされる.htaccessファイルが作成されるので、そのファイルをresultフォルダに置いてください。

PHPファイルの実行は、PHPが実行できる環境があればなんでもいいですが、私は普段使っているエディタVisual Studio Code上で実行しました。


まとめ


.htaccessが必要になることは結構多いと思うので、なかなか使えると思います。


この記事が気に入ったらサポートをしてみませんか?