このサイトはWordPressテーマ「JIN」を使用しています。
JINはシンプルで使いやすくデザインも柔らかくて、とても良いテーマだと思います☆
サイト制作に当たって少しカスタマイズした部分があったのですが、ここでは
技術ブログ「Qiita」のLGTMランキングを作る方法
を紹介したいと思います。
カスタマイズは自己責任でお願いします。不具合が出た時に、テーマやプラグイン製作者に直接質問もしくはSNSで発信するのはやめましょう!
どんなことが出来るの?
こんな感じでQiitaで自分が書いた記事をLGTMランキングで表示できます☆
(自分の場合は会社と個人で2つあったので並べて表示してます)
カスタマイズ方法
Qiitaテーブルを追加
QiitaAPIを使用してQiita記事を取得しますが、API取得は重いので、Cronで定期取得してテーブルに入れておきます。こうすることで高速にランキングページを表示できます(ランキング取得時はorder
キーで取得)。
自分はphpMyAdminで以下のSQLを実行しました。
CREATE TABLE `qiita` (
`url` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
`likes_count` smallint(5) unsigned NOT NULL DEFAULT '0',
`page_views_count` int(10) unsigned NOT NULL DEFAULT '0',
`order` tinyint(3) unsigned NOT NULL DEFAULT '0',
`update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`url`),
KEY `order` (`order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
url | 記事URL https://qiita.com/tempura/items/856e369d3e953e5829e6 |
---|---|
title | 記事タイトルUnityの便利なAsset |
likes_count | LGTM数(旧Qiitaではいいね表記だったのでこの名前)223 |
page_views_count | PV数52956 |
order | 表示順(昇順)2 |
update_date | データ更新時間(ランキング更新時に変わる)2022-07-01 00:00:00 |
QiitaAPIのアクセストークンを取得
https://qiita.com/settings/tokens/new
ここからアクセストークンを取得します(read_qiita
のみチェックを入れる)。
ランキング更新
QiitaAPIを使用してQiita記事を取得し、LGTM順にテーブルを更新します。
以下のPHPをCronで定期実行させます(自分は1週間に1回実行してます)。
qiita-update.php
<?php
//$is_debug = true;
$access_token = '';
$post_count = 23;
$per_page = 5;
$dsn = '';
$username = '';
$password = '';
// デバッグフラグで画面にログ出力可能
if(isset($is_debug)) ini_set('display_errors', "On");
// Qiita記事取得
$qiitas = array();
$page_count = ceil($post_count / $per_page);
for($page = 1; $page <= $page_count; $page++) {
// API取得
$url = 'https://l0lnp1f6p2.execute-api.ap-northeast-1.amazonaws.com/default/extend_qiita_api?token='.$access_token.'&page='.$page.'&per_page='.$per_page;
$responses = request_api($url);
foreach($responses as $response) {
$add_qiita = array(0 => array(
'url' => $response['url'],
'title' => $response['title'],
'likes_count' => $response['likes_count'],
'page_views_count' => $response['page_views_count']));
// LGTM順にソート
$index = 0;
$likes_count = $add_qiita[0]['likes_count'];
$page_views_count = $add_qiita[0]['page_views_count'];
foreach($qiitas as $qiita) {
$now_likes_count = $qiita['likes_count'];
$now_page_views_count = $qiita['page_views_count'];
if($likes_count > $now_likes_count) {
// まずはLGTMが多いものを優先
break;
} else if($likes_count == $now_likes_count) {
// LGTMが同じ場合はPVが多いものを優先
if($page_views_count > $now_page_views_count) {
break;
}
}
$index++;
}
array_splice($qiitas, $index, 0, $add_qiita);
}
}
// Qiitaテーブル更新
try {
$pdo = new PDO($dsn, $username, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]);
$pdo->beginTransaction();
$order = 0;
foreach($qiitas as $qiita) {
$query = 'REPLACE INTO `qiita` VALUES ("'.$qiita['url'].'", "'.$qiita['title'].'", '.$qiita['likes_count'].', '.$qiita['page_views_count'].', '.$order.', NOW())';
if(isset($is_debug)) echo '<pre>'.$query.'</pre>';
$pdo->query($query);
$order++;
}
$pdo->commit();
} catch (PDOException $e) {
$pdo->rollback();
if(isset($is_debug)) echo $e->getMessage();
}
function request_api($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close($ch);
return json_decode($json, true);
}
$is_debug | デバッグフラグで画面にログ出力可能(開発時の確認) |
---|---|
$access_token | QiitaAPIのアクセストークン |
$post_count | 投稿数 ※自分は23記事あって5記事ずつ5ページ取得してます |
$per_page | 1ページあたりの記事数(1から100まで) ※自分は23記事あって5記事ずつ5ページ取得してます |
$dsn | DB接続情報 |
$username | DBユーザ名 |
$password | DBパスワード |
Qiita API v2ドキュメント
https://qiita.com/api/v2/docs#投稿
ランキングHTMLを追加
function showQiita() {
global $wpdb;
$posts = $wpdb->get_results("SELECT * FROM `qiita` ORDER BY `order`");
$html = '<table style="border-style:none;">';
foreach($posts as $post) {
$html .= <<<EOF
<tr><td style="border-style:none; border-bottom:1px solid #e8e8e8;" align="left">
<strong><span style="font-size:70%"><span style="color:#55C500">{$post->likes_count}LGTM</span> / <span style="color:#55C500">{$post->page_views_count}views</span></span></strong><br>
<a href="{$post->url}" rel="noopener noreferrer" target="_blank">{$post->title}</a>
</td></tr>
EOF;
}
$html .= '</table>';
return $html;
}
add_shortcode('qiita', 'showQiita');
外観 > テーマファイルエディタ > テーマのための関数(functions.php)
に上記ショートコードを追加。
SQLでorder
順の記事を取得して、あとはHTMLをゴニョゴニョやってるだけですw
ランキングページ
注意点
【QiitaAPI】利用制限
認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。
DB接続情報は外に漏らさないように注意しましょう。
本記事の内容はエンジニアの方にやってもらうことをオススメします。
なんでカスマイズしたの?
以前はQiita連携を行えるWordPressプラグインを使っていたのですが、ある時動かなくなって、サイトリニューアルのタイミングで勉強も兼ねて作ってみました♪
最後に
QiitaもいいけどZennでも記事を書いてみたいなぁ。
てかZenn、ドメインがzenn.dev
って、こだわりが感じられて好きw
〜オセロを作りながらゲームのプログラムを学ぼう〜