今までGoogleのページランクは0のままでしたが、先週から2になっていました。
運営開始が2006年10月7日なので、2ヶ月ちょっとですね。アクセスも順調に増えてきていて、うれしい限りです。
- Google Crisis Response(Google)
- 災害に関する情報源や、行方不明者情報の収集と検索を行う『パーソンファインダー』を初めとするツールの提供が行われています。
2007年1月21日 日曜日
2007年1月18日 木曜日
プラグイン製作に挑むことにしました。このページはそのテスト用です。
普通の記事ページでもいいのですが、何かあったときの影響範囲を狭めるのと、個別に開くと人気度が変化してしまうために専用の記事を使うことにしました。
メモ
カスタムフィールド
- キー
- yo_keyword
値を得る
指定の記事のカスタムフィールドの値を得る。
- get_post_meta($post->ID, 'yo_keyword', true);
- $post->ID
- 記事ID
- ‘yo_keyword’
- 値がほしいキー
- true
- このキーが1つだけのときtrue。falseだとリストになる。
プラグインオプションの処理
Saving Plugin Data to the Database
get_option($option):値の取得
add_option($name, $value, $description, $autoload):新規追加
update_option($option_name, $newvalue):更新。ない場合は add_option() が呼ばれる
delete_option($name):オプションの削除
class を使う場合のオプションページ登録
class を使っている場合(OOP)、add_options_page()
の第5引数は次のようにする。
- array(&$this, 'function_name')
この引数が、call_user_func_array()
の第1引数になる。これをやらないと、「First argument is expected to be a valid callback」と警告が出る。
フォームの値
フォームからの値はグローバル変数の $_POST や $_GET で得られるが、WordPressはどちらも独自の方法でエスケープしている。(/wp-settings.php
)
このエスケープは強制的に行われるため、フォームを使う場合は stripslashes によるアンエスケープが必要。
- // If already slashed, strip.
- if ( get_magic_quotes_gpc() ) {
- $_GET = stripslashes_deep($_GET );
- $_POST = stripslashes_deep($_POST );
- $_COOKIE = stripslashes_deep($_COOKIE);
- }
- // Escape with wpdb.
- $_GET = add_magic_quotes($_GET );
- $_POST = add_magic_quotes($_POST );
- $_COOKIE = add_magic_quotes($_COOKIE);
- $_SERVER = add_magic_quotes($_SERVER);
エスケープ処理を行っている関数 add_magic_quotes()
は、/wp-includes/functions.php
で定義されている。
再起処理により、階層の深い配列にも対応するようになっている。
- function add_magic_quotes($array) {
- global $wpdb;
- foreach ($array as $k => $v) {
- if ( is_array($v) ) {
- $array[$k] = add_magic_quotes($v);
- } else {
- $array[$k] = $wpdb->escape($v);
- }
- }
- return $array;
- }
最終的なエスケープ処理をする $wpdb->escape()
は、/wp-includes/wp-db.php で定義されている。$wpdb は クラス wpdb のインスタンス。
- // ====================================================================
- // Format a string correctly for safe insert under all PHP conditions
- function escape($string) {
- return addslashes( $string ); // Disable rest for now, causing problems
- if( !$this->dbh || version_compare( phpversion(), '4.3.0' ) == '-1' )
- return mysql_escape_string( $string );
- else
- return mysql_real_escape_string( $string, $this->dbh );
- }
進行具合
デバッグ&テスト中。
本番テストということで、アフィリエイト広告のキーワードとして使ってみています。
記事のメタ情報を利用するため、記事ループの中でないと使えないことが判明。サイドバーのアフィリエイト広告に使いたかったのでちょっと残念。
TODO
オプションを保持している変数をクラスオブジェクトにする。メソッドの引数によるオプションの上書き処理を、オプション用クラスのメソッドとして切り離す。- 管理画面のオプション設定画面の表示を専用クラスに切り離す。
キーワードをランダムに1つ選択するメソッドの実装。オプション設定画面の整理。カスタムフィールドに改行で区切って複数のキーワードが入れられるようにする。キーワードを得る方法に、配列とJSONを追加。
参考資料
2007年1月16日 火曜日
設置から1週間が経ち、Amazon Search のほうが広告の選択がいいことが判明したため、左サイドバーのAmazon.co.jp のお任せリンクを削除しました。
- 2007年1月9日の記事 Amazon Search を試験的に設置してみました
お任せリンクとの比較のために商品ジャンルを書籍に限定していましたが、あとでほかのジャンルも含まれるようにする予定です。
また、ちょっと特殊なコードを埋め込んだので(規約違反にはなっていないはずです)、そのレポートもしたいと思います。
2007年1月15日 月曜日
ちょっと思いついたのでメモ。時間があればプラグインとして作ってみようと思いますが、今はただのメモ。
実はもうある?ご存知の方ぜひ教えてください。面白そうだから作るよというのも大歓迎です。
アフィリエイト要に記事にキーワードを付ける
Amazon.co.jp のライブリンクのように、ASP型のアフィリエイトサービスには、キーワードによって表示する商品を動的に決定することができるものがあります。お任せリンクではキーワードの抽出がどうなっているのかわからず曖昧になりがちですが、直接指定することで好きなように決めることができます。
ブログでは、カテゴリーという概念があります。記事を大まかに分類するわけです。もう少し細かいものにタグがあります。これも一種のキーワードといえますが、アフィリエイト用としてはまだちょっと曖昧な気がします。細かくしすぎるとタグの意味がなくなってしまいますし。
キーワードを記事に紐付ける
ということで、専用のキーワードという概念が必要であると私は結論付けました。そして、それを WordPress のカスタムフィールドでできないかと考えています。記事の ID と紐付けられた形でデータベースに記録されるようなので、記事 ID からたどって値(ここではキーワード)を取得することも可能なはずです。
ここまでくればあとは簡単。アフィリエイトの広告表示コードを出力する関数を定義したプラグインを作るだけ。キーワードを URL エンコードして埋め込むようにしてやれば、投稿画面で設定したキーワードを広告表示コードに渡すことができるはずです。表示はテンプレートに関数を埋め込んでもらいます。
柔軟にする
プラグインオプションの設定画面がほしいですね。
広告コードを設定することができればいろいろ対応できますし、ほかにもいろいろオプションが必要になるかもしれません。
その他
キーワードの設定がない場合はカテゴリーを使えばいいでしょうか。オプションで初期値を設定できるというのもありかも。
2007年1月11日 木曜日
記事の人気度を表示する、Popularity Contest の日本語版を導入しました。
インストールは一般的なプラグインと同じで、アップロードして有効にするだけ。記事本文の一番最後に、次のように人気度が自動的に挿入されます。
- <p class="akpc_pop">人気度: 20%</p>
別の場所にしたいとか、デフォルトとは違うコードにしたい場合は、ファイルの上のほうにある変数(手元のファイルでは38行目)
$ak_show_popularity_with_post の値を1から0にします。
プログラム上は1以外にすればいいと思いますが、次のように書かれているので一応0に。
- /* -- INSTALLATION --------------------- */
- // Change this to "0" below if you don't want to show each post's popularity with the post content
- $ak_show_popularity_with_post = 1;
そして、挿入したいところに次のコードを入れます。ランク表示のテキストだけが出力されるので、好みのタグにすることができます。
- < ?php akpc_the_popularity(); ?>
ランクはパーマリンクのクリックやトラックバックなど、さまざまなアクションの点数制によって決まります。アクションごとにどれくらい加算していくのかは、管理画面のオプション→人気度 で変更できます。
また、ダッシュボード→人気記事一覧 から、詳細な人気記事のリストを見ることができます。
2007年1月9日 火曜日
このブログの左サイドバーにある画像付きの広告は、Amazon.co.jp のお任せリンクというアフィリエイトサービスによるものです。コンテンツにあわせて最適の商品が選ばれるという、非常にありがたいものです。
こりゃいいやということで、導入してみたわけですが、どうも精度がいまいちで、「ほんとにお任せして大丈夫?」という感じ。初日はドンピシャだったんですけどねぇ・・・。
お任せリンクとよく似たサービスに、Amazon Search というものがあります。Drk7jpさんによるものですが、実はお任せリンクよりも前からあります。ちなみに、現在はまだベータ版(ベータ3)です。
このサービス、お任せリンクよりも精度がいいという記事を最近目にしまして、試験的に導入してみることにしました。
精度の比較が主目的なので、お任せリンクのすぐ下に入れました。
広告の設定は、どちらも同じにしてあります。サイズは160×600のワイド スカイスクレイパーというタイプで、商品ジャンルは書籍(多分和書+洋書。個人的には和書だけにしたい)です。
さて、実際の精度ですが、今のところ Amazon Search の圧勝ですね。
お任せリンクでは単なる一般向けのベストセラーのような感じ。ドラマの原作を並べられてもねぇ。たまに洋書専門になったりもしてます。
Amazon Search ではコンピューター系が入ってくれます。去年の12月のアーカイブでは、ブロードバンドにサーバーにブログといい感じです。日本語ドメインに関する記事『日本語ドメインをクリック可能にするガイドライン』では、見事に関連するもので埋まってくれました。ちなみに、お任せリンクは一般向けベストセラーと未成年お断り物・・・。
このまましばらく様子を見て、問題なさそうだったらお任せリンクをはずします。
2007年1月7日 日曜日
Akismet de-spam view Hack と呼ばれるハック(プログラムの改造。不正アクセスではない)があります。
WordPeress のスパムブロックプラグイン Akimet の捕獲したスパム一覧で、半角英数記号以外が含まれたスパム(以下、マルチバイトスパムと表記します)が含まれているものだけ表示するようにするというものです。
大概のスパムは半角英数のみです。そして、多くの日本語サイトに届くスパムでないコメントやトラックバックは日本語によるものです。だったら、マルチバイトスパム以外を表示しなければすっきりするじゃないかというのが、このハックのコンセプトです。
また、power source*さんによる、管理画面のダッシュボードにマルチバイトスパムの捕獲数を併記するハックがあります。
今回、スパム対策の一環としてこの2つのハックを試してみました。効果抜群で、すっきりしたスパム一覧とマルチバイトスパムの捕獲数表示に喜んでおります。
お二人への感謝と還元と自分への覚書として、この2つのハックの解説をしてみたいと思います。また、思いつきで追加ハックもしました。
なお、ハックした WordPress のバージョンは2.04です。
Akismet de-spam view Hack
オリジナル
ファイル /wp-content/plugins/akismet/akismet.php の267行目。
- $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT 150");
ハック
- $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content) ORDER BY comment_date DESC LIMIT 150");
変更したのは、一覧に表示するデータを得る部分です。データベースサーバにスパム判定されたコメントのデータを要求しています。このハックでは、SQL の条件文(WHERE
節)にマルチバイトではないという条件を AND
で加えています。
追加部分のコード
- AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content)
テーブル wp_comments
のフィールド comment_content
に格納されているコメントの本文に対し、関数 LENGTH
と CHAR_LENGTH
の結果が一致していないというものです。LENGTH
はバイト数を、CHAR_LENGTH
は文字数を返します。マルチバイト文字は1文字が1バイトではないため、2つの結果は一致しません。
マルチバイトスパムの捕獲数をダッシュボードに併記するハック
オリジナル
ファイル /wp-content/plugins/akismet/akismet.php の323行目。関数 akismet_stats
付近。
- function akismet_stats() {
- $count = get_option('akismet_spam_count');
- if ( !$count )
- return;
- $path = plugin_basename(__FILE__);
- echo '<h3>'.__('Spam').'</h3>';
- echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', "edit.php?page=$path", number_format($count) ).'</p>';
- }
関数 akismet_stats
のハック
- function akismet_stats() {
- $count = get_option('akismet_spam_count');
- // $count = ksd_spam_count();
- $mbs_count = mb_spam_count();
- if ( !$count )
- return;
- $path = plugin_basename(__FILE__);
- echo '<h3>'.__('Spam').'</h3>';
- echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', "edit.php?page=$path", number_format($count) ).'</p>';
- if ( $mbs_count ) {
- echo '<p><strong><a href="edit.php?page='.$path.'&akismet_list=mb">要チェック</a></strong>: マルチバイト文字を含むものを '.$mbs_count.' 件捕獲中です。</p>';
- } else {
- echo '<p>この中にマルチバイト文字を含むものはありません。</p>';
- }
- }
マルチバイトスパムのカウントと表示を追加しています。4行目がマルチバイトスパムのカウント、10~14行目がダッシュボードに表示する部分です。
もともとのハックではマルチバイトスパム以外も含めた捕獲数を捕獲中のものだけにしてありますが、私の好みで総数に戻してあります。捕獲中のものだけにしたい場合は、2行目のコメントアウトをはずし、3行目をコメントアウトするか削除してください。また、もとのハックではリスト表示にする変更をしてありますが、こちらも好みで段落にしてあります。
4行目で呼び出している関数 mb_spam_count
は、新たに定義したものです。関数 ksd_spam_count
に、マルチバイトであることを条件に加えたものになっています。Akismet de-spam view Hack と同様の変更です。
基本的にはどこに記述しても構いませんが、akismet_stats の近くが良いでしょう。私は akismet_stats の直後にしました。
mb_spam_count
- function mb_spam_count() { // マルチバイトスパムの件数
- global $wpdb, $comments;
- $count = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content)");
- return $count;
- }
ksd_spam_count
ファイル /wp-content/plugins/akismet/akismet.php の195行目。
- function ksd_spam_count() {
- global $wpdb, $comments;
- $count = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'");
- return $count;
- }
追加ハック
解説は以上ですが、思いつきで従来の一覧表示もできるようにしてみました。
267行目(Akismet de-spam view Hack の場所)
引数を見て、どちらの表示にするか処理を分岐させています。引数の名前は被らなければなんでもいいのですが、とりあえず akismet_spam_list としました。値が mb ならマルチバイトスパムのみ、それ以外なら従来の表示になります。
- switch ($_GET['akismet_spam_list'])
- {
- case 'mb':
- $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND LENGTH(comment_content) <> CHAR_LENGTH(comment_content) ORDER BY comment_date DESC LIMIT 150");
- break;
- default:
- $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT 150");
- }
関数 akismet_stats
せっかくなので、ダッシュボードのリンクも変更します。マルチバイトスパムがあったときの表示をする行(ハックの11行目)を、次のようにします。
- echo '<p><strong><a href="edit.php?page='.$path.'&akismet_spam_list=mb">要チェック</a></strong>: マルチバイト文字を含むものを '.$mbs_count.' 件捕獲中です。</p>';
これで、要チェックのときはマルチバイトスパムだけの表示にでき、最近の傾向を見たいときなどでは従来の表示にすることができます。
参考情報
- Function Reference/wpdb Class « WordPress Codex:
- データベースアクセス用クラス
- Database Description « WordPress Codex:
- データベーステーブル
2007年1月5日 金曜日
秋葉原専門ブログとしてトップクラス(ブログランキングドットネットで総合2位)のアキバBlogさんですが、今日2007年1月5日は2年以上ぶりの休みだそうです。
コンピューター関連の情報をメインにいつも拝見させていただいていますが、休みの日があった記憶がありません。雨の日も風の日も毎日のように秋葉原を巡回しているのですね。台風の日の記事も何度かありましたね。
怒涛の更新に頭の下がる思いです。うちなんか、1週間更新なしなんてざらですから・・・。
ちょっと気になったのが、関連リンクの下のアマゾンアフィリエイト。キーワードが指定できるタイプなのですが、この記事ではキーワードが過労死。相当お疲れなんでしょうか(・_・;
6日からはまた更新再開だそうです。倒れたりしないでくださいね。
2007年1月8日 22時19分追記
記事のアドレスが間違っていたようなので修正しました。ちゃんと見れたので安心してたのですが、どこで間違えたんでしょう・・・。
誤 http://www.akibablog.net/archives/2007/01/2blog.html
正 http://www.akibablog.net/archives/2007/01/2blog_1.html
plasticdreamsさんの記事、投稿画面へベタ書き派? エディタ派?より。
ふと気になった事なんですけど,WordPress の記事(他のブログツールでもいいですけど)を書く時に WP の管理画面の Write Post から書くのか,それとも何か XMLRPC 対応のエディタで書いて送信するのか,はたまた単なるエディタ(メモ帳とか秀丸とかサクラとか)で書いた上で Write Post にコピペするのか,皆さんはどの方法で書いてるんでしょう?
私はテキストエリアベタ書き派ですね。画像のアップロードを含めて上から順に書いていきたいからです。ほかのサイトを参照しながら書くときはブラウザだけで完結できますしね。(私はFirefoxを愛用しています)
ほかの方も書いているように、うっかり入力したものを消してしまう危険性はあります。実際、何度かやってしまったこともあります。それでもフォームで書くのは、私がタグをバンバン入れるからかもしれません。タグ入力支援機能が便利で便利で(笑)
べた書き派として注意しているのは、保存は頻繁にすること。
これは普通のテキストエディタを使っている場合にも当てはまりますが、ウェブベースの場合は特に注意が必要です。自動保存とかしてくれませんので。保存が面倒な場合は、とりあえず投稿する文章だけでもコピーしておくと良いですね。
あとは、タグ入力支援のため、WP-AddQuicktag を導入しています。結構便利です。
2007年1月4日 木曜日
2006年12月28日に行ったコメントスパム対策ですが、効果があったようです。アクセスログを確認したところ、wp-comments-post.php へのアクセス数が激減していました。
ただ、トラックバックスパムは相変わらずです。残念ながら、この対策でスパムを完全に追い出すのは難しいようです。前回の記事にトラックバックをいただいたTSJ付゛録゛IIさんでは効果がないとのことですが、同じ状況なのかもしれません。
なお、アクセスログを見ていて気が付いたのですが、コメントスパムとして処理されたアクセスは、ユーザーエージェント情報が次のようになっていることが多いようです。
- Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)
Maxthon について検索したところ同名のブラウザが見つかりましたが、これがスパマーに直結するとは判断できません。掲示板スパムでの書き込みに使われていることが多いようですが、まじめな書き込みでも使われています。残念ながら、決定的なものとはいえないですね。