Help us understand the problem. What is going on with this article?

Node.jsでCSVからPHPに雑に変換してみる

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; の後に改行が入りますが動作に影響は無いので無視で・・・

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした