wordpress - 記事内の画像のサイズを表示するプラグイン - Imagesize 0.1

眠れないのでwordpressプラグインを書いてみた。PHPほぼ初なのでかなり駄目なプログラムだと思うけれど、試しに公開してみる。たぶん、誰もこんなのいらないと思いつつ…。
何をするプラグイン
wordpressの記事に書いた画像の大きさ(横*縦)をカスタムフィールドに放り込み、記事内の任意の位置に表示する。サムネイル画像を表示させている場合、元の(リンク先の)大きな画像のサイズを表示する。複数画像があった場合はコンマ区切りで表示します。
新しく記事を作った場合、前の記事に変更を行った場合、下のdisplayImagesizeを記入したページを開いた場合、に計算を行います。ページを開いた場合はまだカスタムフィールドに値が入っていない場合のみ計算します(前の記事を開いた場合にも対応させるため)。
自分の写真素材配布サイトのために作ったので、普通のブログでは物凄くいらない予感。です。
動いているのはhttp://www.pancakeplan.jp/にて。下の赤丸のように大きさが表示されます。

wordpress2.6.2で作っています。サムネイル画像と元画像の関係はwordpressのディフォルトの形になってないと動かないです。元画像がhoge.jpgならサムネイルはhoge-300x200.jpgな具合いです。あと画像は通常のHTMLタグ(img src="")の形でないとマッチングできません。

使い方
プラグインをwp-content/pluginsの中に入れ、有効にした後 WP テーマ内の大きさを表示したい位置に、以下のコードを挿入してください。

<?php if(isset($is)) $is->displayImagesize(); ?>

プラグインファイル
Imagesize.zip
PHPのままだとアップできなかったのでzip圧縮しています。

注意点
PHP素人が初めてwordpressプラグインを作ったものです。不具合が起こる可能性がありますので自己責任で…。
把握済み不具合としては、カスタムフィールドを使っているので、プラグインを削除する際にカスタムフィールドに入っているデータが残ってしまう、という致命的なものが。削除用プログラムを書けば良いのですが…とりあえず自分用なので…。


今後の予定
ファイルサイズを取れるようになりたいです。あとは色数とか…。色は別プラグインかと思いますが、多い色が取れると嬉しいです。フォトライフの色別的な。PHPのライブラリは見つけてあるので、時間があればできそうです。


ソースファイル

<?php
/*
Plugin Name: Imagesize
Plugin URI: http://d.hatena.ne.jp/so_ra_to/
Description: 記事中の画像の大きさをカスタムフィールドに入れ、記事中に表示させます
Author: sorato
Version: 0.1
Author URI: http://d.hatena.ne.jp/so_ra_to/
*/
/*  Copyright 2008 sorato  (email : sorato@pancakeplan.jp)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/


/******************************************************************************
  * 使い方 :
  *  プラグインを有効にした後 WP テーマ内の大きさを表示したい位置に、
  *  <?php if(isset($is)) $is->displayImagesize(); ?>
  *  を挿入してください。
  *****************************************************************************/

if(class_exists('Imagesize')) {
 
  $is = & new Imagesize();
  
 
 //最初にカスタムフィールドに入れるフック
 add_action('publish_post', array(&$is, 'getImagesize'));
 add_action('edit_post', array(&$is, 'getImagesize'));
}


class Imagesize {
   
   var $regimg;
   var $regsmallimg;
   
   var $image_folder;
   
   
   
   /**
   * The Constructor
   *
   * @param none
   * @return Object reference
   */
   function Imagesize() {
       $this->regimg = "\<img\ssrc\=\"((.+\/)(.+)\.(.+?))\".*?\>";
       $this->regsmallimg = "(.+)\-.+";
   }


   function getImagesize() {
       $post = get_post();
       $post_content = $post->post_content;
       
       $post_this_id = $post->ID;
       
       if ( preg_match_all("/".$this->regimg."/i", $post_content, $match, PREG_SET_ORDER) ) {
         $count_image = count($match); //ページ内の画像数
         
         $image_urls = array();
         $image_sizes = array();
         
         foreach ($match as $image_num => $image_array) {
           $image = $image_array[1];
           $image_path = $image_array[2];
           $image_name = $image_array[3];
           $extension = $image_array[4];
           
           $image_url = $image;
           
           if ( preg_match("/".$this->regsmallimg."/i", $image_name, $matchsmall) ) {
             $bigimagename = $matchsmall[1];
             $image_url = $image_path.$bigimagename.".".$extension;
           }
           
           //$image_url 拡大画像のURL、拡大画像が無い場合は画像そのもののURL
         
           
           $image_urls[] = $image_url;
           
           //幅と高さを得る
           $information = getimagesize($image_url);
           
           $width = $information[0];
           $height = $information[1];
           
           $image_sizes[] = $width.'*'.$height;
         }
         
         $image_sizes_string = '';
         
         foreach ($image_sizes as $image_num => $size) {
           $image_sizes_string .= $size.', ';
         }
         
         $image_sizes_string = preg_replace("/(.+)\,\s/","\\1",$image_sizes_string);
         
         //カスタムフィールドに入れる
         delete_post_meta($post_this_id, 'imagesize');
         add_post_meta($post_this_id, 'imagesize', $image_sizes_string, true);
       }
       return $image_sizes_string;
   }
   
   
   
   function displayImagesize() {
     $html = '';
     $post = get_post();
     $post_this_id = $post->ID;
     
     $meta = get_post_meta($post_this_id, 'imagesize', true);
     
     //強制的にすべてのページに対して実行
     $meta = $this->getImagesize();
     
     if ($meta == false) {
       $meta = $this->getImagesize();
     }
     
     
     $html .= '<br /> サイズ:';
     $html .= $meta;
     
     echo $html;
   }
   
   
}

?>

参考サイト


言い訳…とかとか
なぜわざわざカスタムフィールドを使っているか、なんですが、元はWP-PostRatingsが星評価の保存に使っているのを見て良いなと思ったので、やってみたかっただけだったりします。本当は画像の多い色を取ってくるプラグインを先に思いついたのですが、いきなりそれは無理だと思い、ちょっと簡単そうな画像サイズをやってみました。すごく将来的にはある大きさより大きい画像のみを検索などできるのではと考えています。…実装は考えてませんけれど。それに、カスタムフィールド=メタデータと考えると画像メインのエントリの場合、使い方として間違っているわけではないんではないかと思うのです。でも、なにぶんSQLのデータ自体を汚してしまう感じがする(ちゃんと消すプログラムを書けということですが…)ところが、嫌な感じです。
このカスタムフィールドにプログラム的にデータを入れる部分は日本語では情報が無くて、結局先のWP-PostRatingのコード内から探し出しました。なにかの参考に一応データの入れ方をメモしておきます。
まず挿入は以下。

add_post_meta($post_id, $meta_key, $meta_value, $unique);

$post_idがカスタムフィールドを入れる投稿のid。これは基本かもですが、以下のように取ってきています。

$post = get_post();
$post_id = $post->ID;

$meta_keyがカスタムフィールドのキーの名前。$meta_valueがカスタムフィールドの値。$uniqueがそのキーを単独のものとするかどうかのスイッチです。trueだと単独、falseだと新しく作ります。これはカスタムフィールドは同じキーの値を複数許すためにあるようです。単独にした場合は上書きでなく、書き込みを行わないようです、たぶん。なので、このプログラムではデータを新しく入れる前に削除を行っています。(とか言ってたらupdate post meta()というのを発見してしまいました。これがたぶん上書きです)
画像が複数あった場合に、カスタムフィールドも複数許そうかと思いましたが、単純にやると際限なくページを更新する度にカスタムフィールドの数が増えていったので止めました。なんか良い方法があればそちらのほうが綺麗な気もします。
削除は以下。

<?php delete_post_meta($post_id, $key, $value); ?> 

引数は挿入と一緒です。これらの詳しくはadd_post_metadelete_post_metaのあたりに書いています。

それから、とてもくだらないけど、プラグインPHPで、はまりかけたこと、思ったことをメモしておきます。

  • プラグインPHP文字コードはUTFでないと管理画面の日本語が化ける
  • PHP正規表現は扱いやすいような、気がする
  • PHPのクラス内でゴソゴソやるときは$this->が必要
  • preg_match_allは出力の並び順が選べる。ディフォルトの方が違和感。
  • rubyに慣れすぎて;を忘れない…