関連記事表示。_は/に読み替え。解説という名のメモ 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>';
}
?>