WordPressでCSV入稿したデータを扱う
クライアントワークで培ったtipsを公開するとき、それは闇と表裏一体である。
クライアント「数字とか情報が変わる部分を更新可能にしたい。大量にあるからCSVアップロードで入稿したい」
プラグインなどの利用も考えたが、いろいろあってアップロードページを作ることにした。
要件
- CSV入稿
- 文字コードはUTF-8
要件はこれだけ。
時間が無限にあれば独自プラグインの作成を喜んでやったと思うが、実はこのとき、使える工数はそんなになかった。
固定ページを使う
管理画面にカスタムページを作ってどうこうを調べて作るより、固定ページを使うことにした。これでスペースの用意の手間が省ける。
というわけでcsvというスラックを持つ固定ページを作り、テーマ内にpage-csv.phpを作った。
とはいえ、当然クライアント以外から見えてはいけないページである。そのため、ここは二重の仕掛けを施した。
固定ページを非公開設定にする:これでログインしていないユーザーからは見えないし、robotに拾われることもない。
テーマ内の記述をログインしているかどうかの条件分岐で覆う:これで万が一ページを公開してしまってもログインしていなければ中身が見えることはない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?php if(is_user_logged_in()){ ?> <section> <h2>CSVアップロードページ</h2> <?php // アップロードを許可するファイル名 $permitFile = array('sample.csv'); ?> <div> <h3>ファイルのアップロード</h3> <form method="post" action="/csv/" enctype="multipart/form-data"> <input type="file" name="file"/> <input type="submit" value="送信"/> </form> </div> <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // postリクエストによる遷移の場合 echo '<div>'; echo '<h3>アップロードの結果</h3>'; $path = $_SERVER['DOCUMENT_ROOT'] . '/csv/'; echo '<p>'; if( $_FILES['file']['error'] == 0 ) { // エラーじゃない場合 if(in_array( $_FILES['file']['name'], $permitFile)){ // ファイル名が許可ファイルのどれかかどうか // ファイルを指定したパスへ保存する if( move_uploaded_file( $_FILES['file']['tmp_name'], $path.$_FILES['file']['name']) ) { $file = $path.$_FILES['file']['name']; system('nkf --overwrite -w ' . $file); $csv = file_get_contents($file); //- $csv = mb_convert_encoding($csv, 'utf-8', 'Windows-31J'); // CSVがshift-JISの場合 $array = array_map("str_getcsv", explode("\n", $csv)); array_pop($array); // CSVをJSONに変換して保存 $json = json_encode($array, JSON_UNESCAPED_UNICODE); $file_json = $file . '.json'; file_put_contents($file_json, $json); echo 'アップロードされたファイルを保存しました。'; } else { echo 'アップロードされたファイルの保存に失敗しました。'; } } else { echo '上記のアップロードが可能なファイルのみアップロードしてください。ファイル名は合っていますか?'; } } else { echo 'エラーによりアップロードできませんでした。'; } echo '</p>'; echo '</div>'; } ?> </section> <?php } else { echo '<meta name="robots" content="noindex, nofollow">'; $url = empty($_SERVER["HTTPS"]) ? "http://" : "https://"; $url .= $_SERVER["HTTP_HOST"]; echo '<script>setTimeout(function(){window.location.href = "'.$url.'";}, 0);</script>'; } ?> |
ここでは省いたがタイトルの下にはアップロード可能なファイル名の一覧など、クライアントへのメッセージがもう少し書いてある。
データの使用
あとは、保存したJSONデータを呼び出す。
1 2 3 4 5 |
<?php $file = $_SERVER['DOCUMENT_ROOT'] . '/csv/sample.json'; $json = file_get_contents($file); $array = json_decode($json, true); ?> |
これ以降はPHPの配列として扱うだけです。