WordPress

【JIN】WordPressでQiitaのLGTMランキングを作る(PV数やストック数も取得可能)

このサイトはWordPressテーマ「JIN」を使用しています。

JINはシンプルで使いやすくデザインも柔らかくて、とても良いテーマだと思います☆
サイト制作に当たって少しカスタマイズした部分があったのですが、ここでは

技術ブログ「Qiita」のLGTMランキングを作る方法

を紹介したいと思います。

カスタマイズは自己責任でお願いします。不具合が出た時に、テーマやプラグイン製作者に直接質問もしくはSNSで発信するのはやめましょう!

【JIN】プロフィールのSNSボタンをカスタマイズする方法このサイトはWordPressテーマ「JIN」を使用しています。 WordPressテーマ「JIN」 JINはシンプルで使い...
【JIN】ピックアップコンテンツ「メニュータイプ」をオシャレにするカスタマイズこのサイトはWordPressテーマ「JIN」を使用しています。 WordPressテーマ「JIN」 JINはシンプルで使い...

どんなことが出来るの?

Qiitaこれまでに書いた記事一覧です。 ...

こんな感じで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_countLGTM数(旧Qiitaではいいね表記だったのでこの名前)
223
page_views_countPV数
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_tokenQiitaAPIのアクセストークン
$post_count投稿数
※自分は23記事あって5記事ずつ5ページ取得してます
$per_page1ページあたりの記事数(1から100まで)
※自分は23記事あって5記事ずつ5ページ取得してます
$dsnDB接続情報
$usernameDBユーザ名
$passwordDBパスワード

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

ランキングページ

Qiitaこれまでに書いた記事一覧です。 ...

注意点

【QiitaAPI】利用制限
認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。

DB接続情報は外に漏らさないように注意しましょう。
本記事の内容はエンジニアの方にやってもらうことをオススメします。

なんでカスマイズしたの?

以前はQiita連携を行えるWordPressプラグインを使っていたのですが、ある時動かなくなって、サイトリニューアルのタイミングで勉強も兼ねて作ってみました♪

最後に

QiitaもいいけどZennでも記事を書いてみたいなぁ。
てかZenn、ドメインがzenn.devって、こだわりが感じられて好きw

【エビでもわかる】オセロプログラミング
〜オセロを作りながらゲームのプログラムを学ぼう〜
「Unityで初めてゲームを作ってみたい!」

そんな人のためにこの本を作りました。
オセロを一から作りながら実践形式でプログラムを学べる本です。
すでに完成したプロジェクトを説明するのではなく、実際に作りながら説明していきます。
一緒に手を動かしながら、プログラムを覚えていきましょう🌟