yukari-n
1/5/2017 - 1:54 PM

関連記事表示。_は/に読み替え。解説という名のメモ https://yukari-n.gitbooks.io/wordpress/content/related-posts/

関連記事表示。_は/に読み替え。解説という名のメモ https://yukari-n.gitbooks.io/wordpress/content/related-posts/

<?php
//関連記事表示

function unset_private_post($plist,$post_id){
	//非公開だけでなくリンク元と同じ記事IDやアーカイブページなども一応削除
	foreach($plist as $rpost){
		if(get_post_status($rpost) != 'publish' || $rpost == 0 || $rpost == $post_id){
			unset($plist[$rpost]);
		}
	}
	$plist = array_values($plist);
	return $plist;
}

/*
 * 現段階ではとりあえず、
 * 1.手動でどうしても表示させたい記事を表示
 * 2.ランダムである程度関連する記事を表示(カテゴリなどで絞る)
 * 3.ランダム表示した中でクリック実績があるものは2.よりも優先的に表示
 * という設計。
 * ただ1.と3.で欄が埋まると表示内容が固定されがちなので、
 * 最低1枠はランダムにするなどを考え中。
 * 2.の処理を本文を解析してできる様になれば完璧
 */

function make_related_posts($post_id){
	$max_num = 5;
	$count = 0;
	$plist = array();
	$manual = get_post_meta($post_id,'related');
	if($manual){
		$plist = explode(',',implode($manual)); //implodeがないとexplodeでエラーが出る
		$plist = unset_private_post($plist,$post_id);
		$count = count($plist);
	}
	if($count < $max_num){
		//データの保存の時点でどうにかしないとここの処理が遅くなる可能性
		$clicked = explode(PHP_EOL,file_get_contents(ABSPATH.'lib/google/related_data.php'));
		for($j=0;$j<$data_count;++$j){
			$ids = explode('-',$clicked[$j]);
			//違う記事のデータと、既にリストにある場合は飛ばす
			if($ids[0] != $post_id || in_array($ids[1],$plist)){continue;}
			array_push($plist,$ids[1]);
		}
		$plist = unset_private_post($plist,$post_id);
		$count = count($plist);
	}
	if($count < $max_num){
		$year = date('Y');
		$wp_query = new WP_Query();
		$param = array(
				'posts_per_page' => $max_num,
				'post_type' => array('post','blog'),
				'post_status' => 'publish',
				'year' => $year.','.$year - 1, //今年or昨年の記事のみ表示
				'orderby' => 'rand'
		);
		$wp_query->query($param);
		if($wp_query->have_posts()): while($wp_query->have_posts() && $count < $max_num) : $wp_query->the_post();
		$id = get_the_ID();
		if($id == $post_id || in_array($id,$plist)){continue;}
		array_push($plist,$id);
		endwhile; endif; wp_reset_postdata();
	}

	$html = '<h3 id="relp">'.__('Related Posts',get_bloginfo('name')).'</h3><div class="list-group">';
	//relpって何処かで使ってたか?
	$count = 0;
	foreach($plist as $rpost){
		if($count >= $max_num){break;}
		$img = post_main_img($rpost,null,'medium',false);
		$html .= post_list_small($rpost,'RelatedPosts',"'".$post_id."-".$rpost."'",$img);
		++$count;
	}
	$html .= '</div>';
	return $html;
}
?>
<?php
/*
 * Google Analyticsのデータから関連記事一覧を作成するための
 * データを取得しておくためのプログラム
 */

$thisfunc = 'related';
require_once(dirname(__FILE__).'/token.php');

if($client->getAccessToken()){
	try{
		$start_date = date('Y-m-d', strtotime("-90 day", time())); // 90日前から
		$end_date = date('Y-m-d', strtotime("today", time())); // 今日まで
		$metrics = 'ga:totalEvents';
		$optParams = array(
				'dimensions' => 'ga:eventCategory,ga:eventLabel',
				'sort' => '-ga:totalEvents',
				'filters' => null,
				'max-results' => 1000 // 取得数
		);
		$data = $service->data_ga->get(GOOGLE_ANALYTICS_PROFILE_ID, $start_date, $end_date, $metrics, $optParams);

		$results = array();
		foreach($data['rows'] as $row => $value) {
			foreach($data['columnHeaders'] as $key => $header) {
				$results[$row][$header['name']] = $value[$key];
			}
		}

		$string = null;
		$data_count = 0;
		foreach($results as $result) {
			if($result['ga:eventCategory'] != 'RelatedPosts'){continue;}
			$string .= "{$result['ga:eventLabel']}".PHP_EOL;
			++$data_count;
		}
		$naiyou = $data_count.PHP_EOL.$string;
		$file_path = dirname(__FILE__).'/related_data.php';
		file_put_contents($file_path,$naiyou);

		echo '<pre>'.$naiyou.'</pre>';

	} catch(apiServiceException $e) {
		echo $e->getMessage();
	}
}
else{
	echo '<a href="',$client->createAuthUrl(),'">Get token!</a>';
}
?>