WordPressカスタマイズ事例

外部サイトからデータを取得して、それが自サイトにないデータだったら記事として登録する

外部サイトのAPIを使ってそこのデータを取得して、こちらの記事として登録したい、というニーズはほとんどありません。
が、一回だけありました。
それは、外部サイトに制作物のポートフォリオがあって、そのそれぞれの制作物の詳細情報をこちらのサイトで表示したいとき、でした。
ポートフォリオ情報は外部サイトからAPIで取得したデータを、こちらで用意しておくアーカイブページで表示させればそれですみます。
しかし、そのアーカイブをクリックしたら詳細ページに行かなければならない、となると、こちらのサイトに、リンク先となる空の詳細ページが存在しないといけません。一方、制作物のポートフォリオは外部サイトのほうで勝手に増えていきます。となると、自動で空詳細ページを登録しなければならない、ということになります。

そこで、

「APIで製品IDを取得して、そのIDのページがこちらのサイトになければ登録する」

ということをやってみます。

制作物のカスタム投稿タイプ名を’products’とします。

まず、テーマの function.php に、現在同記事が存在するかどうかチェックするプログラムを記述します。

function whetherExistPost($type, $slug){
	$loops= new wp_query();
	$loops->query("post_type={$type}&name={$slug}");
	if($loops->have_posts()) {
		return true;
	} else {
		return false;
	}
}

次に、products-archive.php に以下を記述します。

<?php
$url = "http://hogehoge.com/api/portfolio/all/"; //他サイトのAPIです。
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$arr = json_decode($json,true);

if ($arr === NULL) {
	return;
}else{
	$json_count = count($arr["products"]);

	$product_ids = array();
	for($i=$json_count-1;$i>=0;$i--){
		$product_ids[] = $arr["products"][$i]["id"]; //APIで取得したproducts IDを配列に格納
	}

	foreach( $product_ids as $product_id ){
		
		//なんか表示させる処理(省略)

		if(!whetherExistPost('products', $product_id)){ //スラッグがproducts IDのページが存在しないなら
			$my_post = array(
				'post_name' => $product_id, //スラッグをproducts IDに
				'post_title' => '製品 '.$product_id, //ページタイトルを「製品 product_id」に
				'post_status' => 'publish',
				'post_type' => 'products'
			);
			// 投稿をデータベースへ追加
			wp_insert_post( $my_post );
		}
	}
}

あまり用途ないかもしれませんが、同様の要件があった際には参考にしてください。


その他のWordPressカスタマイズ事例