訂正 wordpressでコメントから画像をアップできるようにした

wordpressでコメントから画像をアップできるようにした - jk25kの日記の内容に間違いがあったので訂正。元記事の方も訂正いれた。

間違っていた所

add_filter('comment_post'   , 'jk25k_comment_post');

だとコメントが登録された後に呼び出されるので、そこで画像形式チェックしてエラーになってもコメントは投稿完了になってしまう。
プラグイン API/アクションフック一覧 - WordPress Codex 日本語版では

comment_post
アクション関数引数: コメントID、承認ステータス(spam/スパム、0/未承認、1/承認済み)
コメントがデータベースに保存される直前に実行する。

となっていたのだけど、Plugin API/Action Reference « WordPress Codexでは

comment_post
Runs just after a comment is saved in the database. Action function arguments: comment ID, approval status ("spam", or 0/1 for disapproved/approved).

と、保存直後に実行されるとのこと。真逆。実際試してみたところ、やっぱりコメントが投稿完了後に呼び出されていて、コメントは反映されているんだけど、エラー画面が表示されていた。翻訳のミスかな。

じゃあ保存前のフックは何なの?

ということで探したところ、preprocess_comment がそれに該当する。引数は、$commentdataという配列で、コメントの情報が格納されている。内容は変更しても良いが、$commentdataを返す必要がある。

ということで修正したソース

<?php
/*
Plugin Name: jk25k
Plugin URI: http://d.hatena.ne.jp/jk25k/
Description: コメントから画像アップロードをします。
Version: 1.0.1
Author: jk25k
Author URI: http://d.hatena.ne.jp/jk25k/
*/
define('JK25K_VERSION', '0.9.0');
function jk25k_comment_post_pre($commentdata) {
  if ( file_exists($_FILES["img01"]["tmp_name"]) ) {
    $size = getimagesize($_FILES["img01"]["tmp_name"]);
    $sfx="";
    if ( $size[2]==IMAGETYPE_GIF ) {
      $sfx = "gif";
    } elseif ( $size[2]==IMAGETYPE_JPEG ) {
      $sfx = "jpg";
    } elseif ( $size[2]==IMAGETYPE_PNG ) {
      $sfx = "png";
    }
    if ( !$sfx ) {
      wp_die( ('添付画像は、GIF/JPEG/PNG形式のどれかでお願いします。') ); //面倒なので直接日本語を書いた。
    }
  }
  return $commentdata;
}
function jk25k_comment_post($id,$status) {
  if ( file_exists($_FILES["img01"]["tmp_name"]) ) {
    $size = getimagesize($_FILES["img01"]["tmp_name"]);
    $sfx="";
    if ( $size[2]==IMAGETYPE_GIF ) {
      $sfx = "gif";
    } elseif ( $size[2]==IMAGETYPE_JPEG ) {
      $sfx = "jpg";
    } elseif ( $size[2]==IMAGETYPE_PNG ) {
      $sfx = "png";
    }
    if ( $sfx ) {
      move_uploaded_file($_FILES["img01"]["tmp_name"], "wordpressの絶対パス/comm-image/".sprintf("%09d",$id).".".$sfx );
    }
  }
}
function jk25k_comment_view() {
  global $comment;
  echo nl2br($comment->comment_content); //顔文字変換などをしている場合は対処が必要だけど今回は無視
  $file_name = sprintf("%09d",$comment->comment_ID);
  if ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".jpg") ) {
    echo "<img src=\"/comm-image/".$file_name.".jpg\" />";
  } elseif ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".gif") ) {
    echo "<img src=\"/comm-image/".$file_name.".gif\" />";
  } elseif ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".png") ) {
    echo "<img src=\"/comm-image/".$file_name.".png\" />";
  }
}
function jk25k_comment_delete($id) {
    $file_name = sprintf("%09d",$id);
  if ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".jpg") ) {
    unlink("wordpressの絶対パス/comm-image/".$file_name.".jpg");
  } elseif ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".gif") ) {
    unlink("wordpressの絶対パス/comm-image/".$file_name.".gif");
  } elseif ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".png") ) {
    unlink("wordpressの絶対パス/comm-image/".$file_name.".png");
  }
}

add_filter('preprocess_comment', 'jk25k_comment_post_pre');
add_filter('comment_post'      , 'jk25k_comment_post');
add_filter('comment_text'      , 'jk25k_comment_view');
add_filter('delete_comment'    , 'jk25k_comment_delete');
?>

wordpressでコメントから画像をアップできるようにした

wordpressでコメントから画像をアップできるようにした。プラグインで良いものがあるのかも知れないけれど検索しても見つけられなかったのでザックリ作った。
2011/08/27 追記 wordpress2.9で作ったので、今のバージョンでは対応していないかも知れません。

機能

  • コメント欄からローカルの画像ファイルを選択してコメント投稿の内容としてアップロードする。
  • 画像形式をチェックして、JPEG/GIF/PNGでなかったらエラーにする。
  • コメント表示時に一緒に画像を表示する。

アップロード先ディレクトリを用意

  • /comm-image/ を作成し、phpから書き込めるように設定する。ディレクトリ名はプラグイン中にベタ書きしてるので合わせる必要がある

コメントのテンプレートをいじる

コメント欄でローカル画像ファイルを選択させる必要があるのでテンプレート(/wp-content/themes/default/comments.php)を直した。

  • 該当のformタグに、enctype="multipart/form-data"を追加。
  • input type="file" を追加。name="img01" とした。この名称はプラグイン中にベタ書きしてるので合わせる必要がある。

それ用のプラグインを追加

2009/12/23訂正 下記のソースに誤りがあったので訂正 wordpressでコメントから画像をアップできるようにした - jk25kの日記で訂正したソースを書きました。
以下のようなソースのプラグインを作成して、/wp-content/plugins/ にアップ。管理画面で使用するに設定。

<?php
/*
Plugin Name: jk25k
Plugin URI: http://d.hatena.ne.jp/jk25k/
Description: コメントから画像アップロードをします。
Version: 1.0.0
Author: jk25k
Author URI: http://d.hatena.ne.jp/jk25k/
*/
define('JK25K_VERSION', '0.9.0');
function jk25k_comment_post($id,$status) {
  if ( file_exists($_FILES["img01"]["tmp_name"]) ) {
    $size = getimagesize($_FILES["img01"]["tmp_name"]);
    $sfx="";
    if ( $size[2]==IMAGETYPE_GIF ) {
      $sfx = "gif";
    } elseif ( $size[2]==IMAGETYPE_JPEG ) {
      $sfx = "jpg";
    } elseif ( $size[2]==IMAGETYPE_PNG ) {
      $sfx = "png";
    }
    if ( $sfx ) {
      move_uploaded_file($_FILES["img01"]["tmp_name"], "wordpressの絶対パス/comm-image/".sprintf("%09d",$id).".".$sfx );
    } else {
      wp_die( ('添付画像は、GIF/JPEG/PNG形式のどれかでお願いします。') ); //面倒なので直接日本語を書いた。
    }
  }
  return $status;
}
function jk25k_comment_view() {
  global $comment;
  echo nl2br($comment->comment_content); //顔文字変換などをしている場合は対処が必要だけど今回は無視
  $file_name = sprintf("%09d",$comment->comment_ID);
  if ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".jpg") ) {
    echo "<img src=\"/comm-image/".$file_name.".jpg\" />";
  } elseif ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".gif") ) {
    echo "<img src=\"/comm-image/".$file_name.".gif\" />";
  } elseif ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".png") ) {
    echo "<img src=\"/comm-image/".$file_name.".png\" />";
  }
}
function jk25k_comment_delete($id) {
    $file_name = sprintf("%09d",$id);
  if ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".jpg") ) {
    unlink("wordpressの絶対パス/comm-image/".$file_name.".jpg");
  } elseif ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".gif") ) {
    unlink("wordpressの絶対パス/comm-image/".$file_name.".gif");
  } elseif ( file_exists("wordpressの絶対パス/comm-image/".$file_name.".png") ) {
    unlink("wordpressの絶対パス/comm-image/".$file_name.".png");
  }
}

add_filter('comment_post'   , 'jk25k_comment_post');
add_filter('comment_text'   , 'jk25k_comment_view');
add_filter('delete_comment' , 'jk25k_comment_delete');
?>

IE7+Googleツールバーでiframeのエンコードに問題

地味なトラブル対応をした。

現象

  • UTF-8のページ内にEUC-JPのページをiframeで表示。
  • どちらのページもエンコードの宣言は適切。
  • IE7で問題が発生
  • 問題は、エンコードが自動的にUTF-8になり、iframe内が文字化ける。
  • メニューからエンコードの自動選択を外し、強制的にEUC-JPを指定してもUTF-8の設定に直される。

調査

  • PCにインストールされていたアドインを1個ずつ外し動作を確認した。
  • どうもGoogleツールバーを使用すると発生するようだ。

対処

  • iframe内のページも自前で作っているものだったので、EUC-JPでは無くUTF-8で動作するように直して対応完了。

IE7の問題だったので、IE8にすれば問題解決だったりする。検索しても同様の報告は見つけられず何かちょっとスッキリしない対応だった。IEの使用は限定的になりつつあるし、主に使っているであろう企業内ではGoogleツールバーなどのインストールは禁止されているだろうから報告も出にくいのかも知れないと思った。情報のフィードバックも母数が小さいといくらネットでも難しいのかも知れない。

iwrestledabearonce

iwrestledabearonce | Listen and Stream Free Music, Albums, New Releases, Photos, Videos
グラインドコアデスメタルにそれとは無関係の音が時折顔を出すミクスチャーと言えば簡単だし、最近はジャンルごちゃまぜなのは多いけど、メインがタモリ倶楽部空耳アワーのような楽曲というのが大変に素晴らしい。しかもヴォーカルは女性。ナップスターでも聞ける。

http://www.napster.jp/music/album/12814280

omodaka/plum song


ヨンテンゼロ ! ! ! にも出演してくださった、omodakaの最新のPV。いつも音楽にマッチした映像で驚きます。レジデンツの映像に近い凄さがある。
そんなomodakaが、香港のポッドキャストhttp://www.dragonradio.hk/に紹介されていた。日本を含めたアジア圏のアーティストを紹介する番組でiTunesだと画像部分が曲毎にアーティストサイトのリンクに変わるので聞いていてあっ!って思ったらすぐサイトに飛べてとても親切。新鮮な発見があるのでオススメです。

8bit cafe 4周年PARTY 【 ヨンテンゼロ ! ! ! 】

映像のお手伝いをしました。

8bit cafe 4周年PARTY 【 ヨンテンゼロ ! ! ! 】
http://cotosaga.com/event/575727/

 [25] 00:00〜00:25  dj●【 bull様 】フューチャーポップ★ラウンジ
 [25] 00:25〜00:50 live●【 エイプリルズ 】
 [25] 00:50〜01:15  dj●【 kadal a.k.a. dj8bit 】ROOM1024
 [25] 01:15〜01:40 live●【 Omodaka 】
 [25] 01:40〜02:05 live●【 エイトビットスライドショー'09-02 】
 [25] 02:05〜02:30  dj●【 Yokemura 】この曲を聴け!
 [25] 02:30〜02:55 live●【 HONDALADY 】
 [25] 02:55〜03:20 talk●【 8センチャーズ 】8×16bpm
 [25] 03:20〜03:45 live●【 mexico 】ROOM1024
 [25] 03:45〜04:10 live●【 FQTQ 】フィーチャーポップ★ラウンジ
 [25] 04:10〜04:35  dj●【 higuma  】bluebadge label
 [25] 04:35〜05:00  dj●【 haru* 】bombonera!!

前にやった時はプロジェクタにはコンポジットで繋がっていたハズなのに手元にはVGAのケーブルが来てたり、他の出演者さんのVJは出力がコンポジットだったり、そういうのをネゴネゴするには開演までの時間が微妙だったりと、裏方的にもお祭り気分なイベントでした。
VJミキサのアウトは大抵コンポジットで、PCのアウトをコンポジットに変換するダウンコーバータは持ってることは多くても、その逆のケースってのは滅多無いからまぁパニックにはなるよね。
エイトビットカフェは、映像を使った実験というか遊びというかが気軽にできるお店ですし、これからも色々と面白いことをさせてもらえればと思っています。4周年おめでとうございました!

Craftwife


大変に素晴らしい。iPhoneを使ったアクトとそれをリアルタイムで合わせる映像。開発のソニー、生産の松下じゃないけど、元祖クラフトワークをベースにしていることは間違いないとして、それを現在のそれも日本という場所にもってきたら、きっとこれはかなり正解に近いんじゃないかと思った。もっともっとライブが見たい。
http://www.craftwife.com/