WordPress カスタムフィールドに登録したCSVファイルを表示する方法

WordPress カスタムフィールドに登録したCSVファイルの値をページ内に表示する方法を紹介します。
例えば、商品情報に紐づく取り扱い店舗一覧(CSVファイル)を表示したい時に便利な方法です。

  1. カスタムフィールドにCSVファイルをアップロード
  2. Basic認証がある場合
  3. CSVファイルの文字コードを変更
  4. 都道府県別に見出しを表示
  5. 不要なセル(列)を除外
  6. 検索キーワードに該当する行だけを表示

カスタムフィールドにCSVファイルをアップロード

まずは、カスタムフィールドにCSVをアップロードできるようにします。
使用プラグインはACF、フィールドタイプは「ファイル」を選択してください。
投稿記事にCSVファイルを登録して single.php に以下の記述を追加してください。
紹介しているコードはこのページで説明している機能を全て盛り込んでいます。不要な記述は適宜削除してご利用ください。

<?php
// カスタムフィールドからファイル情報(CSV)を取得
$csv_file = get_field('店舗一覧CSV');
// 出力の確認
if($csv_file){
echo '<a href="'.$csv_file['url'].'">'.$csv_file['filename'].'</a>';
}
// CSVファイルのURLを取得
echo $csv_url = $csv_file['url'];
// Basic認証情報を設定(必要に応じて変更してください)
$username = 'your_username';
$password = 'your_password';
// 認証情報をリクエストヘッダーに追加
$response = wp_remote_get($csv_url, array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode("$username:$password")
)
));
// エラーチェック
if (is_wp_error($response)) {
echo 'エラーが発生しました: ' . $response->get_error_message();
return;
}
// ステータスコードを確認
$status_code = wp_remote_retrieve_response_code($response);
if ($status_code != 200) {
echo 'HTTPリクエストが失敗しました。ステータスコード: ' . $status_code;
return;
}
// レスポンスのボディを取得
$file_content = wp_remote_retrieve_body($response);
// 文字エンコーディングをUTF-8に変換
$encoding = mb_detect_encoding($file_content, ['UTF-8', 'SJIS', 'EUC-JP', 'ISO-2022-JP']);
if ($encoding !== 'UTF-8') {
$file_content = mb_convert_encoding($file_content, 'UTF-8', $encoding);
}
// CSVデータを配列にパースする
$rows = explode("\n", $file_content);
$header = str_getcsv(array_shift($rows)); // ヘッダー行を取得
// 都道府県別にデータを分類
$data_by_prefecture = array();
foreach ($rows as $row) {
$cells = str_getcsv($row);
if (isset($cells[2])) {
$prefecture = trim($cells[2]);
if (!isset($data_by_prefecture[$prefecture])) {
$data_by_prefecture[$prefecture] = array();
}
$data_by_prefecture[$prefecture][] = $cells;
}
}
// 都道府県別にテーブルを表示
foreach ($data_by_prefecture as $prefecture => $rows) {
echo '<h2>' . esc_html($prefecture) . '</h2>';
echo '<table border="1">';
echo '<tr>';
// ヘッダーの表示
foreach ($header as $index => $col) {
if ($index != 0 && $index != 1) { // 1列目と2列目を除外
echo '<th>' . esc_html($col) . '</th>';
}
}
// 行の表示
echo '</tr>';
foreach ($rows as $row) {
echo '<tr>';
foreach ($row as $index => $cell) {
if ($index != 0 && $index != 1) { // 1列目と2列目を除外
echo '<td>' . esc_html($cell) . '</td>';
}
}
echo '</tr>';
}
echo '</table>';
}
?>

Basic認証がある場合

サイト全体やファイルのアップロード先ディレクトリにBasic認証がかかっている場合は、認証情報をリクエストヘッダーに追加します。
ユーザーIDとパスワードを任意の値に変更してください。

CSVファイルの文字コードを変更

CSVの文字コードがUTF-8じゃない場合に文字化けが起こる場合、アップロードするCSVファイルの文字コードを変更するか、アップロード後に自動的に変換するようにします。

都道府県別に見出しを表示

店舗一覧などで都道府県別(例えば、北海道や青森県)に表を分けたい場合は、エリア情報が記載されているセルを指定して、エリア別に見出しと表をセットにして並べるよう表示します。指定したセル番号に記載されている文字情報が連続して続くとセットになります。

不要なセル(列)を除外

CSVで不要なセルを除外したい場合、セル番号を指定して表示を飛ばすことができます。

検索キーワードに該当する行だけを表示

検索キーワードに該当する行だけを表示するようにするには、ワードの指定と除外の指定を追加します。

<?php
// カスタムフィールドからファイル情報(CSV)を取得
$csv_file = get_field('店舗一覧CSV');
// 出力の確認
if($csv_file){
echo '<a href="'.$csv_file['url'].'">'.$csv_file['filename'].'</a>';
}
// CSVファイルのURLを取得
echo $csv_url = $csv_file['url'];
// 認証情報を設定(必要に応じて変更してください)
$username = 'your_username';
$password = 'your_password';
// 認証情報をリクエストヘッダーに追加
$response = wp_remote_get($csv_url, array(
'headers' => array(
'Authorization' => 'Basic ' . base64_encode("$username:$password")
)
));
// エラーチェック
if (is_wp_error($response)) {
echo 'エラーが発生しました: ' . $response->get_error_message();
return;
}
// ステータスコードを確認
$status_code = wp_remote_retrieve_response_code($response);
if ($status_code != 200) {
echo 'HTTPリクエストが失敗しました。ステータスコード: ' . $status_code;
return;
}
// レスポンスのボディを取得
$file_content = wp_remote_retrieve_body($response);
// 文字エンコーディングをUTF-8に変換
$encoding = mb_detect_encoding($file_content, ['UTF-8', 'SJIS', 'EUC-JP', 'ISO-2022-JP']);
if ($encoding !== 'UTF-8') {
$file_content = mb_convert_encoding($file_content, 'UTF-8', $encoding);
}
// 検索キーワードを取得
$search_keywords = '山口 イオン'; // ここを動的に変更できるようにする
$keywords = explode(' ', $search_keywords);
// CSVデータを配列にパースする
$rows = explode("\n", $file_content);
$header = str_getcsv(array_shift($rows)); // ヘッダー行を取得
// 都道府県別にデータを分類
$data_by_prefecture = array();
foreach ($rows as $row) {
$cells = str_getcsv($row);
if (isset($cells[2])) {
$prefecture = trim($cells[2]);
if (!isset($data_by_prefecture[$prefecture])) {
$data_by_prefecture[$prefecture] = array();
}
// キーワードが含まれているかチェック
$row_text = implode(' ', $cells);
foreach ($keywords as $keyword) {
if (stripos($row_text, $keyword) !== false) {
$data_by_prefecture[$prefecture][] = $cells;
break;
}
}
}
}
// 都道府県別にテーブルを表示
foreach ($data_by_prefecture as $prefecture => $rows) {
if (empty($rows)) continue; // 表示する行がない場合はスキップ
echo '<h2>' . esc_html($prefecture) . '</h2>';
echo '<table border="1">';
echo '<tr>';
foreach ($header as $index => $col) {
if ($index != 0 && $index != 1) { // 1列目と2列目を除外
echo '<th>' . esc_html($col) . '</th>';
}
}
echo '</tr>';
foreach ($rows as $row) {
echo '<tr>';
foreach ($row as $index => $cell) {
if ($index != 0 && $index != 1) { // 1列目と2列目を除外
// 値が空でも <td></td> を出力
echo '<td>' . esc_html($cell) . '</td>';
}
}
echo '</tr>';
}
echo '</table>';
}
?>

「検索キーワードを取得」にキーワードを指定します。複数ある場合は半角スペースで区切ってください。全角スペースは検索ワードとしてみなされます。複数ワードの場合、どちらか一方が含まれていると検索結果として表示されます。

まとめ

WordPress カスタムフィールドに登録したCSVファイルを表示する方法を紹介しました。