夏休みの最後にプログラムの難しい話しをします。
興味ない方スルーで^^

WordPressのプラグインを活用する

ショートコードを作成し、プラグインのメソッドを呼び出してカスタマイズする方法を紹介します。
この方法を使えば、デフォルトで用意されているデザインの変更だけでなく、どのような(ま、限界はありますが)カスタマイズも自由に行なえます。
以前にこちらで書いた内容があまりにも適当だったので、まじめに解説します。

はじめに

Count per Dayとは、サイトのアクセスを解析・表示してくれるWordPressのプラグインの1つです。
同じ端末をチェックし、同じ日であれば再カウントしないことが私の気に入っているところです。
他のページカウンタの多くはリロードを繰り返すだけでカウントアップしてしまい、精度に欠けます。
ただし、その分処理は重く何万と訪問者が訪れるようなページではサーバへの負荷が高くなるとのことです。
ここのようにアクセスが少ないサイトであれば全く問題はないようです(笑)
Count per Dayの標準で提供されるウィジェットはテキストベースのシンプルなものだけです。
もっと派手に活用してみたいと思われている方、その願い叶えましょう^^

表示内容の設計

ここで利用させてもらっているテーマのウィジェットは以下のような表示が基本デザインです。
ウィジェット解説

  • 見出し
    ウィジェットの見出しです。文字の下に水色でラインが引かれます。
  • 画像
    主に投稿の見出しとなるイメージで、WordPressのアイキャッチ画像の縮小版です。
  • 投稿の情報
    タイトル、投稿日、アクセス数。
  • 区切り線
    投稿と投稿の区切り。



・サムネール、タイトル、投稿日、アクセス数
この4つが基本です。
ウィジェットの表示は、基本的にこのデザインに合わせることにします。
標準のCount per Dayではサムネールの表示は行えません。
よって、デザインだけでなく、サムネール表示も含めてカスタマイズします。
※ どのような表示とするかはセンス次第、デザイン能力に劣る私のようにテーマに合わせて統一させても良いですし、自分で好みのデザインにするも、もちろんです。

テーマに合わせた整形処理

「見出し」はウィジェットを追加すれば、同じに表示されると思いますので、その下の投稿の部分を整形する関数を用意します。

配列で渡された投稿の情報を、その数分展開するだけです。
なお、アイキャッチが設定されていることを前提としてしまっています。
設定されていない方は、投稿中の画像を取得するなどに変更して下さい。

サムネール

ウィジェットへの表示処理で’refer’というサムネール画像を参照しています。
縦横比がおかしなサムネールは嫌なので、ハードクロップをtrue(切り抜き)で、画像は50×50の小さいサムネールを’refer’と定義し、追加しました。

サムネールはイメージをアップロードした時に作成されるようです(多分)
後からもう一度イメージを再アップロードなんてありえないので、こんなプラグインを利用すると楽に再構成できます。
・すべてのサムネイルの再生成を可能にします。 Regenerate Thumbnails
大変楽できました。ありがたいです。

さて、下準備は出来たので、どのようなウィジェットを作成していくか考えていきましょう。

最近の投稿ウィジェット

これは簡単で、新しくポストされた投稿を拾って、その投稿のアクセス数を取得するだけです。
指定の投稿に対してのアクセス数を取得するにはshow()メソッドを使用します。

‘show( $before, $after, $show, $count, $page )’

$before = text before number e.g. ‘<p>’ (default “”)
$after = text after number e.g. ‘reads</p>’ (default ” reads”)
$show = true/false, “echo” complete string or “return” number only (default true)
$count = true/false, false will not count the reads (default true)
$page (optional) PostID

取得したデータを先ほど作った整形関数用に配列化して、呼び出すだけ。
この関数をショートコードとして、テキストのウィジェットなど用意すれば完成です。

ウィジェットの設定などは最後に説明します。

人気投稿のウィジェット

以下の画面で表示することとします。
・アーカイブページ
・トップページ

ちょっと工夫するのが、アーカイブページでの表示です。
アーカイブページとはカテゴリーやタグが選択された時に対象となる投稿を一覧する画面のことです。
表示投稿を絞っているので、その絞った投稿に関係する人気投稿のみを表示させたいですね。

例えば、こんな画面。
アーカイブ(カテゴリー)
アーカイブページの例。
カテゴリー「創」を押すと、そのカテゴリーに含まれる投稿が一覧表示される。
ページ送りにも自動対応。

この場合は「創」カテゴリーに属する人気のある投稿だけを表示したい。


アーカイブ(タグ)
同様にタグ「音源モジュール」を選択した時のアーカイブ表示。
選択されたタグに絞った人気投稿の表示を行いたい。

実はCount per Dayのメソッドの仕様でこちらの時の処理が面倒。
何が面倒かはタグアーカイブの処理の説明参照。

ウィジェットの表示設計が済んだら、いよいよ処理の実装です。

カテゴリーアーカイブの処理

人気投稿を取得するメソッドgetMostVisitedPostIDs()は、カテゴリーをキーとして指定可能です。

‘getMostVisitedPostIDs( $days, $limit, $cats, $return_array )’

$days last x days, default = 365
$limit return max. x posts, default = 10
$cats IDs of categories to filter, array or number
$return_array true returns an array with Post-ID, title and count, false returns comma separated list of Post-IDs

アーカイブでカテゴリーがキーの場合は以下の処理となります。
なお、カテゴリーの階層には対応していないので、子カテゴリーを含む親カテゴリーを指定する場合は、get_term_children()などで子カテゴリーすべてを渡す必要があります。

※投稿に複数のカテゴリーが指定されている場合、訪問数がカテゴリー分合算されてしまうようです。
 もし、そのような運用をされている場合は何らかの処理を加える必要があります。
 バグなのか仕様なのかは不明。

用意されたメソッドを呼び出すだけの簡単なお仕事です。
楽勝楽勝。

タグアーカイブの処理

さて、問題はタグをキーとしたい時。
いくつか思いついた処理方法を書き出してみます。

  1. カテゴリー指定無しで処理
    Count per Dayのメソッドにカテゴリー指定なしで検索させます。
    つまり、全件検索ということですね。
    検索された投稿が指定された「タグ」に一致するものだけ抽出することで実装します。
  2. 所属カテゴリーを求めてから処理
    指定された「タグ」を含む投稿を検索、その投稿が所属するカテゴリーを再度検索し、ストックします。
    重複したカテゴリーをサマリしてカテゴリーリストを作れば後はカテゴリーアーカイブと同様の処理で実装出来ます。
  3. Count per Dayのメソッドに頼らず、自前で処理
    カテゴリーをキーとして自力で投稿を検索し、その結果に閲覧数を付与することで実装します。
    検索処理やら、ソート処理やら全部自前でやらないといけません。

さらに、それぞれを検討してみます。

  1. これはダメです。
    何のためのDBインデックスなのかわかりません。こんな処理を実装しているようではプログラマなんて名乗れません。
    よって問答無用で却下。
  2. それぞれの関係をインデックス利用して検索していますが、ちょっと冗長すぎ。
    ヒットするであろう投稿を二度検索してしまうのもなんだか間抜けです。
    プログラマだったら、こんな無駄な検索の仕方はDB設計者に申し訳ないと思いましょう。
  3. タグがキーなんですから、そこを基準に検索し始めるのが一番ですね。
    プログラムを書くのがプログラマのお仕事。
    なので、リレーション活かした処理をしてやりましょう。
    ということで、これを採用。

結論として、Count per Dayで用意されたメソッドを使ってカテゴリーをキーとしようとするため無理が出るので、人様に頼らず自前で処理をしてしまいましょう。
絞り込みの処理自体はDBが、ソートはPHPの関数がやってくれます。
実は何も自分ですることがありません(笑)

※この処理では、期間を指定しての訪問数は取得できません。ご注意を。

これですっきり。

まとめ

トップページと検索アーカイブページへの対応を追加してまとめたものが以下となります。

自分のサイトに合わせて、自由に変更して利用して下さい。

ウィジェット設定

すべてテキストウィジェットを作成し、既存のウィジェットが不要なら置き換えるだけです。

最近の投稿
ショートコードを記述したテキストウィジェットを作成し、デフォルトの「最近の投稿」ウィジェットと入れ替えるだけ。
最近の投稿(ウィジェット画面) 表示例 ▶▶▶ 最近の投稿(表示)
最近の人気投稿
テキストウィジェットを作成し、ショートコードを記述。
オプションにdays=7(過去7日まで遡って検索)、view=1(訪問数を表示する)を指定する。
最近の人気投稿(ウィジェット画面) 表示例 ▶▶▶ 最近の人気投稿(表示)
過去の人気投稿
テキストウィジェットを作成し、ショートコードを記述。
オプションにdays=365(過去1年まで遡って検索)、view=1(訪問数を表示する)を指定する。
過去の人気投稿(ウィジェット画面) 表示例 ▶▶▶ 過去の人気投稿(表示)
人気投稿
テキストウィジェットを作成し、ショートコードを記述。
オプションにlimit=20(最大表示20件)、view=1(訪問数を表示する)、title=1(見出しの表示)を指定する。
daysの指定を行っていないため、全期間が集計対象。
アーカイブページで表示させます。
人気投稿(ウィジェット画面) 表示例 ▶▶▶ 人気投稿(表示)

おしまい

Count per Dayはユーザーが自由にデータを使えるようになっています。
PHPを直接扱わなくても、ショートコードを使えば投稿中に様々な情報を出すことも可能です。
詳しくはこちらを参照下さい。

次回はYARPP(Yet Another Related Posts Plugin)をショートコードで制御するお話しの予定です。
いつになるかはわかりません^^