アクセス数の多いコンテンツを表示  【解決済み】

質問全般・改善要望
mark
メンバー
メンバー
記事: 3
登録日時: 2009年9月14日(月) 10:10

アクセス数の多いコンテンツを表示  【解決済み】

投稿記事by mark » 2009年9月14日(月) 10:20

今回はじめてmodxを利用します。

FAQの製作を考えているのですが、その際によくあると問い合わせを自動的に表示させたいと思っています。

仕組み的には、FAQ内(カテゴリ)で一番多くアクセスがあったページを一覧で表示させたいです。

これを可能とするようなスニペット、プラグイン、モジュール等はあるのでしょうか?

[modx]
バージョン:1.0.0J
sama55
メンバー
メンバー
記事: 816
登録日時: 2009年8月03日(月) 08:16

Re: アクセス数の多いコンテンツを表示

投稿記事by sama55 » 2009年9月14日(月) 12:09

mark さんが書きました:FAQの製作を考えているのですが、その際によくある問い合わせを自動的に表示させたいと思っています。
仕組み的には、FAQ内(カテゴリ)で一番多くアクセスがあったページを一覧で表示させたいです。
これを可能とするようなスニペット、プラグイン、モジュール等はあるのでしょうか?
[modx]
バージョン:1.0.0J

ズバリというものはなさそうな気がします。プログラミングが可能であれば、以下の手順で実装できそうですが、このような単純論理では、ページにアクセスされるたびにDBやファイルへのアクセスが発生しますし、「よくある問い合わせ」ページも描画性能が期待できないので、modxの最大の持ち味である高速性が失われる気がします。
  1. ページ単位にアクセス数を記録するアドオンを追加
  2. アドオンで積算されたページごとの値をDBやファイルから読み込むクエリースニペットを作る
  3. FAQの各ページに2.を呼び出すテンプレート変数を適用
  4. Ditto/Wayfinderなどで3.のテンプレート変数値で降順ソート&表示する件数を指定してリスト出力
mark
メンバー
メンバー
記事: 3
登録日時: 2009年9月14日(月) 10:10

Re: アクセス数の多いコンテンツを表示

投稿記事by mark » 2009年9月14日(月) 13:52

返信ありがとうございます。

やはり、アクセス解析から地道にページビューが多い順にピックアップして、1週間に1回程度書き換えるのがよさそうです。

ありがとうございました。
アバター
yama
管理人
記事: 3154
登録日時: 2009年7月29日(水) 02:50

Re: アクセス数の多いコンテンツを表示

投稿記事by yama » 2009年9月14日(月) 15:32

Dittoのエクステンダーを書くとよいのかなと思ったけど、カウント専用のスニペットを作ってテンプレート変数を利用するテが簡単でよさそう。テンプレート変数の内容を更新するメソッドはなかったと思うので(なんでだろう・・)、そこは自作する必要がありそうですが。

コード: 全て選択

$count = $modx->documentObject['カウンター'][1];
$count++;
updateDocumentObject('カウンター', $count);


みたいな
アバター
enogu
メンバー
メンバー
記事: 32
登録日時: 2009年9月02日(水) 23:56

Re: アクセス数の多いコンテンツを表示

投稿記事by enogu » 2009年9月14日(月) 21:42

APIに無かったらプラグインすればいいじゃない(黙れ
と言うわけでページビューカウンターのプラグインを作りました。

使い方:
pvc.pageviewというNumber型(デフォルト値は0)のテンプレート変数を定義し、アクセス解析したいページのテンプレート(今回はヘルプのテンプレートですかね?)に適用します。
新規プラグインを追加します。名前は何でも動きますが、略称的に私はEnviCounter(塩ビカウンター)と呼びたい(笑)
本体に以下のコードを貼り付けます。(注:phpの開始・終了タグ(<?php ~ ?>)は入れないで下さい。パースエラーの元です。)
イベントを割り当てます。OnLogPageHit あたりにフックしてどうぞ。(アクセス解析のグローバル設定のやり方が分からなかったらOnWebPageInitでも動きます)

コード: 全て選択

 $vars['site_tmplvar_contentvalues'] = $modx->getFullTableName('site_tmplvar_contentvalues');
 $vars['site_tmplvars'] = $modx->getFullTableName('site_tmplvars');
 $vars[':document_id'] = $modx->documentIdentifier;

 //ページビューを計測しているか確認
 $pv = $modx->getTemplateVarOutput(array('pvc.pageview'));
 if ($pv !== false) {
  //カウントアップ開始
#  $modx->dbQuery(strtr("LOCK TABLES site_tmplvar_contentvalues WRITE, site_tmplvars READ", $vars));
  $res = $modx->dbQuery(strtr(
   "SELECT id
   FROM site_tmplvar_contentvalues cn
    INNER JOIN (SELECT @tmplvar := id FROM site_tmplvars WHERE name = 'pvc.pageview') tv
     ON cn.tmplvarid = @tmplvar
   WHERE cn.contentid = :document_id",
   $vars
   ));
  if (0 < $modx->recordCount($res)) {
   $arr = $modx->fetchRow($res);
   $vars[':value_id'] = $arr['id'];
   $modx->dbQuery(strtr("UPDATE site_tmplvar_contentvalues SET value = value + 1 WHERE id = :value_id", $vars));
  }
  else {
   $modx->dbQuery(strtr("INSERT site_tmplvar_contentvalues (contentid, tmplvarid, value) VALUES (:document_id, @tmplvar, 1)", $vars));
  }
#  $modx->dbQuery('UNLOCK TABLES');
 }


遺言:
当初はテーブルをロックしようとしていたのですが、APIに凄い勢いで怒られてコメントアウトせざるを得ませんでした。何がまずかったのでしょうか・・・

最後に:
このコードはWindows XP Pro SP3上のMODx Evolution 1.0.0j(PHP5/MySQL 5.0)で試験しました。

このコードは現状のまま(ぶっちゃけて言うと最低限の動作チェックのまま)提供されています。実用なさる前にコードを十分テストすることをおすすめします。
sama55
メンバー
メンバー
記事: 816
登録日時: 2009年8月03日(月) 08:16

Re: アクセス数の多いコンテンツを表示

投稿記事by sama55 » 2009年9月15日(火) 08:41

ページ単位にアクセス数を記録するアドオンを追加

上記は、本家リポジトリでは、Page Hit Counterだったりする(他にも幾つかあり)ようですが、昨日ざっと試した感じでは、ロジックが古くてEvo 1.0.0でまともに動かなかったのですよね。。。もったいない

問題/改善点)
・テーブル生成に失敗 ※MySQLのバージョン絡み? マニュアルで作ってやればプラグインは動く模様
・積算結果を表示するモジュールの動きが変 ※コアのAjaxの制御が変わったせい?メディア関連ファイルの配置が変わったせい?
・マネージャによるアクセスははじいているが、ボットまでは考慮してない様子
mark
メンバー
メンバー
記事: 3
登録日時: 2009年9月14日(月) 10:10

Re: アクセス数の多いコンテンツを表示

投稿記事by mark » 2009年9月18日(金) 23:33

皆さん書き込みありがとうございます。

自分自身のスキルが低いのでロボットをはじくスクリプトや管理者のアクセスをはじくスクリプトを書くことができないので、
実際に運用できないのが残念です。

但し、modxの可能性を見た感じが致します。

もう少し使い込んで行きたいと思います。

ありがとうございました。