PHPで作るMTプラグイン(2)-投稿者別エントリー数の取得
前回、Movable Type(MT)のPHPプラグインの概略について書きました。
2回目となる今日は「投稿数ランキング」プラグインの作成手順について、です。
コンテナタグ MTEntryRanking
リスト出力のためには、コンテナタグが必須です。
ここでは、指定のブログに投稿可能な投稿者を取得し、投稿者別のエントリー投稿数を求め投稿者情報と対応させます。
既存のタグを参考に作ったのがこちら。
function smarty_block_MTEntryRanking($args, $content, &$ctx, &$repeat) {
$localvars = array('authors', 'author_order_num','author');
if (!isset($content)) {
$ctx->localize($localvars);
//ブログIDを取得
$blog = $ctx->stash('blog');
if ($blog) {
$blog_id = $blog['blog_id'];
} else {
return $ctx->error("No blog available");
}
//このブログに投稿可能な投稿者を取得
$query = "SELECT author_id, author_name, author_nickname "
. " FROM mt_author "
. " LEFT OUTER JOIN mt_permission ON permission_author_id = author_id "
. " WHERE permission_blog_id = {$blog_id}";
$_authors = $ctx->mt->db->get_results($query);
//author_idをキーに配列を作成
$_tmp_authors = array();
foreach ($_authors as $k => $v) {
$_tmp_authors[$v['author_id']] = $v;
}
//投稿数を取得
$query = "SELECT entry_author_id, count(*) as entry_count "
. " FROM mt_entry "
. " WHERE entry_author_id in (" . implode(",",array_keys($_tmp_authors))
. ") AND entry_blog_id = {$blog_id} AND entry_status = 2"
. " GROUP BY entry_author_id";
$_entry_count = $ctx->mt->db->get_results($query);
$_tmp_count = array();
foreach ($_entry_count as $k => $v) {
$_entry_author_id = $v['entry_author_id'];
$_tmp_count[$_entry_author_id] = $v['entry_count'];
}
//投稿数の降順に配列を作成
arsort($_tmp_count);
// 投稿者配列の作成
$authors = array();
foreach($_tmp_count as $k => $v) {
$_tmp_authors[$k]['entry_count'] = $v;
$authors[] = $_tmp_authors[$k];
}
$ctx->stash('authors', $authors);
$counter = 0;
} else {
$authors = $ctx->stash('authors');
$counter = $ctx->stash('author_order_num');
}
if ($counter < count($authors)) {
//投稿者情報を1件取得
$author = $authors[$counter];
$ctx->stash('author', $author);
$ctx->stash('author_order_num', $counter + 1);
$repeat = true;
} else {
$ctx->restore($localvars);
$repeat = false;
}
return $content;
}
投稿数の取得を $ctx->mt->db->fetch_entries()で取得しようか、と前回思ったのですが、エントリーの詳細情報は不要なので、シンプルに投稿数を集計しました。
なお、公開中のエントリーは entry_status = 2 を抽出条件に加えます。
(lib内の関数でもハードコーディングされていました。このあたり、本格的にプラグイン開発する場合はplugin/内では定数化して利用したいところです。)
表示用タグ MTEntryRankingCount,MTEntryRankingName
コンテナタグ内で使用するタグを次に作成します。
コンテナタグにて格納された値から必要なものを取り出すだけの簡単なスクリプトです。
function smarty_function_MTEntryRankingCount($args, &$ctx) {
$author = $ctx->stash('author');
if (!$author) {
return $ctx->error("No author available");
}
$a = isset($author['entry_count']) ? $author['entry_count'] : '';
return strip_tags($a);
}
function smarty_function_MTEntryRankingName($args, &$ctx) {
$author = $ctx->stash('author');
if (!$author) {
return $ctx->error("No author available");
}
$a = isset($author['author_name']) ? $author['author_name'] : '';
return strip_tags($a);
}
これら3つのプラグインを保存したら、次のような感じでテンプレートにタグを配置します。
<ol>
<MTEntryRanking>
<li><MTEntryRankingName>(<MTEntryRankingCount>)</li>
</MTEntryRanking>
</ol>
以上で終了!
もっとスマートにかける部分もあると思いますが習作ということでご勘弁ください。
で、実際の表示はこちら: