WordPress上のPHPでcsvの読み込み!

PHPでCSVを読み込んで出力する方法。Advance Custom Fieldから選んだ値でcsvから該当の行を検索して表示させてみた。

はじめに

こちらのサイトでは、アイキャッチとサブタイトルの下に広告を表示しています。
↑見ていただくとわかる通りですが…
最初は手動で入れていたのですが、めんどくさくなり、とはいっても記事によって、載せる広告の種類を変えたかったので、どういった方法がいいかなぁと思っていました。

まず、載せる広告を自分で選ぶなら、A8.netでしょうね。
Googleアドセンスは閲覧者の好みに紐付いた広告がランダムで表示されるので…


投稿ごとに広告を5つくらいのリストから選ぶには…
プラグインAdvance Custom Fieldsでセレクトボックスの使用かな…と。

目次 はじめに 必要な環境/スキル プラグインのインストール プラグインの設定 サブタイトルの設定 ボタン(リンクの...

セレクトボックスで選んだ値をPHP上で判定してリンクを作成すればいいのですが、広告主が広告掲載終了などをすることがあり、その度にPHPをいじるのもなぁと思ったので、CSVから読み込むことにしました。

1.A8.netでアフィリエイト登録

このA8.netは自分で広告を探して貼り付けるタイプなので、自分のサイトに合った広告を掲載することができます。
好きな大きさ、好きなデザイン(ある程度は決まっていますが)、好きなカテゴリから選べます。



一部の商品は自分で申し込んでも還元されるので、オンラインショッピングなどが好きな方にもおすすめです。

今回はこちらから掲載したい広告のタグをいくつかコピーして、おきます。
わかりやすいように、広告名:広告タグという感じでテキストエディタなどに控えておきましょう。

例)A8.net:<a href="xxxx">....</a>

Advance Custom Fieldsでセレクトボックス設定

Advance Custom Fieldの基本的な使い方はこちらの過去記事からどうぞ。

目次 はじめに 必要な環境/スキル プラグインのインストール プラグインの設定 サブタイトルの設定 ボタン(リンクの...

投稿画面のイメージ

今回は、セレクトボックスを使って広告を選択できるようにします。
こんな感じ。

フィールドグループの作成

Advance Custom Fieldからセレクトボックスの設定をします。

選択しの部分に、

値 : 表示ラベル名

を記載します。

PHPでSplFileObjectを使ったcsvの読み込み

CSVの作成

prから始まる広告No,広告の名前,広告のタグ及び

テーマと同じディレクトリ、もしくは、cssというディレクトリを作ってその配下に置いてもいいと思います。
今回はtest.csvという名前で同じディレクトリにおいています。

PHPの修正

今回のCSVの読み込みにはSplFileObjectを使いました。
が…SplFileObjectがけっこう曲者でした。

PHPの記載場所は本文の直前です。

/*
* ここに記載
*/
<div id="the-content" class="entry-content">
 <?php //記事本文の表示
    the_content( get_theme_text_read_more() ); //デフォルト:続きを読む?>
</div>
※Simplisity2のテーマを使っていますのでentry-body.phpを修正しています。他のテーマの場合はphpファイル名や記事本文の書き方が違うと思うので、該当箇所を探してみてください。

さて、最初にcsv読み込みで下記のように記載したところ…

//エラー(というか画面が表示されない)
$file = new SplFileObject(get_stylesheet_directory_uri(). '/test.csv');
$file->setFlags( SplFileObject::READ_CSV );
foreach ($file as $f) {
   $fields[] = $f; 
    print_r($f);
 }

ファイルパスをフルパス(子テーマのディレクトリ+ファイル名)で指定すると、エラーが起きているのか、画面が正常に表示されず…

$file = new SplFileObject(CSVフルパス);

相対パスならうまくいくのかと思ってやってみてもうまく行かず調べてみると、こんな記事が!

NoRewindIteratorを使うと改善されるという方法を見つけたので、やってみるも、今度はCSVが改行がされないという問題が発生。

//ok(ただし、改行なし)
$url  = get_stylesheet_directory_uri(). '/test.csv'; //オンライン上のCSVファイル
$file = new NoRewindIterator(new SplFileObject( $url ));
foreach ( $file as $line ) {
    $results[] = $line;
    print_r($line);
}

そもそも、SplFileObjectでにファイルのフルパスを引数にすると

rewind()処理の時にポインタを先頭に戻せないためエラーが発生

するんだそうで、それを回避するためにNoRewindIteratorを使うということは、ポインタを先頭に戻す処理をしないということ。
つまり行に関係なく、1文として処理が進んでしまうのです。

でも、NoRewindIteratorを使わないとうまく表示できないので、こうなったら、CSV側に工夫を入れるしかない!
ということでCSVの内容を下記の通りにしてみました。

pr1,ホームページ集客ツールなら【ferret One】,<a hef="xxxxx">ferret One</a>|
pr2,GMOインターネット株式会社【Z.com】,<a hef="xxxxx">Z.com</a>|
pr3,ITインフラエンジニアを始めるなら【ネットビジョンアカデミー】,<a hef="xxxxx">ネットビジョンアカデミー</a>|
pr4,みんなの得意が買えるココナラ,<a hef="xxxxx">ココナラ</a>|
pr5,「ロリポップ!」レンタルサーバー,<a hef="xxxxx">ロリポップ!</a>|

各行一番最後の値に”|”を追加して、PHP内でスプリット処理をすることに。

つまり、流れとしては、

  • 5行文のCSVが1行として読み込まれる
  • 「|」で区切って配列に入れる(1次元配列)
  • 配列ごとにさらに「,」で区切って、1番目の文字列をキーにして別の配列に入れる(2次元配列)

こんな感じ。

最終的なコードがこちら

$select = get_field('test_ad'); //test_adフィールドで選択されている値を取得
if($select){
	$url  = get_stylesheet_directory_uri(). '/test.csv'; //オンライン上のCSVファイル
	$file = new NoRewindIterator(new SplFileObject( $url ));
	foreach ( $file as $l ) {
    	      $pr = explode("|", $l); //"|"で区切って配列prにいれる
	      for ($i = 0 ; $i < count($pr); $i++) {
		     $str = explode(",", $pr[$i]); //"."で区切って配列strに入れる
		     $name = trim($str[0]); //配列の1個目(prXを取得)
		     $results[$name] = $str; //prXをキーとしてresult配列に格納
	     }
	}	
	if($results[$select] ){ //result配列の中にフィールドで選択された値がある場合
		echo '<div class="pr-under-title">' .$results[$select][2].'</div>';
	}
}

実際の運用の流れ

広告を追加・変更するときの流れとしては
まず、Advanced Custom Filedsのセレクトボックス内の値を追加・変更・削除

次にCSV内の該当の行を追加・変更・削除

pr1,ホームページ集客ツールなら【ferret One】,<a hef="xxxxx">ferret One</a>|
pr2,GMOインターネット株式会社【Z.com】,<a hef="xxxxx">Z.com</a>|
pr3,ITインフラエンジニアを始めるなら【ネットビジョンアカデミー】,<a hef="xxxxx">ネットビジョンアカデミー</a>|
pr4,みんなの得意が買えるココナラ,<a hef="xxxxx">ココナラ</a>|
pr5,「ロリポップ!」レンタルサーバー,<a hef="xxxxx">ロリポップ!</a>|

これだけ!

一度作ったらプログラムの変更がないようにしたかったので、上記の感じでやってみました!

スポンサーリンク