CWCF0.5 WordPressのメールフォームプラグイン

2007/11/15 | SNS/CMS/ブログ

WordPressでメールフォームを生成するためのプラグインCWCFをベータ版としてリリースすることにした。以下のリンクからダウンロードできる。

CWCF0.5 WordPress plugin

■使い方
・通常のプラグインと同様の方法でインストールする。
・管理画面のオプションでCWCFという設定項目ができるので、ここで適宜設定する。ラベル名、デフォルト値、必須か否か、エラーメッセージなどが設定できる。
・WordPressのページ作成で、フォームを設置したい箇所に{cwcf}の記述をいれる。

これで作成したページにアクセスすると、メールフォームが表示される(はず)。

■改定履歴
・入力エラーがあり、かつtextarea内で改行があった場合、textarea内にbrタグがつくバグを修正した。
・メールアドレスの書式チェックの正規表現を修正した。
・管理画面の入力でダブルクォーテーションを入れた場合に正しく動作しなくなるバグを修正した。

WordPressのping制御プラグイン

2007/11/11 | SNS/CMS/ブログ

もう一個WordPressのプラグインを作った。
今、記事投稿の自動化プログラムを作成している。このプログラム自体はXML-RPCを使っていて、基本的に以前から使用している機能の寄せ集めなのだが、いろいろ調べていくと・・・、XML-RPCによる記事投稿の際でも、その都度更新pingを送信してくれることがわかった。
これはこれで便利なのだが、1度に10件プログラムで記事投稿すると10回ping送信してしまうことになる。下手をするとpingスパムととられかねない(こういう細かいところはブログツールによって使用が違うようだ)。
そこである一定時間内であればping送信を実行しないよう制御するWordPressプラグインを作成した。ダウンロードは以下のリンクからどうぞ。

CWPC control sending ping plugin for WordPresspso

<?
/*
Plugin Name: CW ping controller
Plugin URI: http://php.tekmemo.com/
Description: Control the continuous sending of ping. This program prohibits sending ping in the specified interval.
Author: kaorun
Author URI: http://php.tekmemo.com/
Version: alpha
*/

  class cwpc
  {
    var $lastsend;
    var $interval;
    
    function cwpc()
    {
      $this->lastsend=intval(get_option(‘cwpc_lastsend’));
      $this->interval=intval(get_option(‘cwpc_interval’));
    }
    
    function process($postId=0)
    {
      $now=intval(date(‘U’));
      if($now > $this->lastsend + $this->interval){
        generic_ping($postId);
        update_option(‘cwpc_lastsend’,$now);
      }
      return $postId;
    }
    
    function admin()
    {
      add_options_page(‘options-general.php’, ‘CWPC’, 8, basename(__FILE__), array(&$this,’processAdmin’));
    }
    
    function processAdmin()
    {
      add_option(‘cwpc_lastsend’,’0′);
      add_option(‘cwpc_interval’,’60’);
      if(strtolower($_SERVER[‘REQUEST_METHOD’])==’post’){
        //update_option(‘cwpc_lastsend’,’0′);
        update_option(‘cwpc_interval’,intval($_POST[‘cwpc_interval’]));
      }
      $values=array();
      $values[‘cwpc_interval’]=get_option(‘cwpc_interval’);
      
      $cwpcOutput=”;
      $cwpcOutput.='<div class=”wrap”>';
      $cwpcOutput.='<h2>CWPC setting</h2>';
      $cwpcOutput.='<form name=”form1″ method=”post” action=”‘.$_SERVER[‘PHP_SELF’].’?page=cwpc.php”>';
      $cwpcOutput.='<table cellspacing=”2″ cellpadding=”5″ class=”editform”>';
      $cwpcOutput.='<tr>';
      $cwpcOutput.='<td>Seconds to prohibit the sending ping</td>';
      $cwpcOutput.='<td><input type=”text” name=”cwpc_interval” value=”‘.$values[‘cwpc_interval’].'” size=”10″></td>';
      $cwpcOutput.='</tr>';
      $cwpcOutput.='</table>';
      $cwpcOutput.='<input type=”submit” value=”submit” />';
      $cwpcOutput.='</form>';
      $cwpcOutput.='</div>';
      echo $cwpcOutput;
    }
  }
  
  $cwpcObj=& new cwpc;
  add_action(‘admin_menu’,  array(&$cwpcObj,’admin’));
  remove_action(“publish_post”, “generic_ping”);
  add_action(‘publish_post’,  array(&$cwpcObj,’process’), 2);

WordPressのメールフォームプラグイン

2007/11/09 | SNS/CMS/ブログ

WordPressでお問い合わせフォームを組み込む必要が出てきた。
プラグインが豊富なところがWordPressの魅力だが、今回は、メールフォーム自体はいくつか見つけたけれど、希望のものが見当たらなかった。で、自作してみた。まだまだアルファ版だが、いちおうプラグインとしてインストールし、メールフォームが必要な箇所の本文中に{cwcf}とかけば動いてくれているっぽい。初期値はメッセージとかは全部英語だが、管理画面から書き換えることができる。もちろん日本語OK。興味のある人は以下のURLからどうぞ。

CWCF contact form plugin for WordPress

<?php
/*
Plugin Name: CW Contact Form
Plugin URI: http://php.tekmemo.com/
Description: Creates a contact form. Enter <strong>{cwcf}</strong> when you need contact form.
Author: kaorun
Author URI: http://php.tekmemo.com/
Version: alpha
*/
  @session_start();
  
  class cwcf
  {
    var $cwcfname_rcpt, $cwcfname_name, $cwcfname_mail, $cwcfname_subj, $cwcfname_addi, $cwcfname_text, $cwcfname_subm;
    var $cwcfreq_rcpt, $cwcfreq_name, $cwcfreq_mail, $cwcfreq_subj, $cwcfreq_addi, $cwcfreq_text, $cwcfreq_subm;
    var $cwcfdef_rcpt, $cwcfdef_name, $cwcfdef_mail, $cwcfdef_subj, $cwcfdef_addi, $cwcfdef_text, $cwcfdef_subm;
    var $params=array(‘name’,’mail’,’addi’,’subj’,’text’,’subm’);
    var  $prefixes=array(‘cwcfname’,’cwcfreq’,’cwcfdef’);
    
    function cwcf()
    {
      foreach($this->prefixes as $prefix){
        foreach($this->params as $param){
          $this->{$prefix.’_’.$param}=get_option($prefix.’_’.$param);
        }
      }
    }
    
    function process($content)
    {
      if(!preg_match(‘|{cwcf}|’,$content)){
        return $content;
      }else{
        $values=array();
        $errors=array();
        $opType=’form';
        if(strtolower($_SERVER[‘REQUEST_METHOD’])==’post’){
          foreach($this->params as $param){
            $values[‘val_’.$param]=(isset($_POST[‘val_’.$param])? $_POST[‘val_’.$param]:”);
            if($this->{’cwcfreq_’.$param} && !strlen($values[‘val_’.$param]) && $this->{’cwcfname_’.$param}){
              $errors[]=$this->{’cwcfname_’.$param}.’ … ‘.get_option(‘cwcfmsg_required’);
            }
          }
          if($values[‘val_mail’]){
            if(!preg_match(“/^[a-z0-9.+-_]+@([a-z0-9-]+(.[a-z0-9-]+)+)$/i”,$values[‘val_mail’])){
              $errors[]=$this->cwcfname_mail.’ … ‘.get_option(‘cwcfmsg_format’);
            }
          }
          
          $now=intval(date(“U”));
          $limit=5;
          $sendFlag=(isset($_SESSION[‘cwcf’][‘send’])? intval($_SESSION[‘cwcf’][‘send’]):0);
          $sentFlag=(isset($_SESSION[‘cwcf’][‘sent’])? intval($_SESSION[‘cwcf’][‘sent’]):0);
          if(!$errors && $sendFlag && ($now – $limit > $sentFlag)){
            $mailFrom=get_option(‘cwcfmail_from’);
            if(!$mailFrom){$mailFrom=$values[‘val_mail’];}
            if(!$mailFrom){$mailFrom=get_option(‘admin_email’);}
            $mailRcpt=get_option(‘cwcfmail_rcpt’);
            if(!$mailRcpt){$mailRcpt=get_option(‘admin_email’);}
            $mailSubj=get_option(‘cwcfmail_subj’);
            if(!$mailSubj){$mailSubj=$values[‘val_subj’];}
            
            $mailBody=”;
            foreach($this->params as $param){
              if($param!=’subm’ && $this->{’cwcfname_’.$param}){
                $mailBody.=’* ‘.$this->{’cwcfname_’.$param}.” : ¥n”;
                $mailBody.=(($values[‘val_’.$param])? $values[‘val_’.$param]:”).”¥n¥n”;
              }
            }
            $mailBody.=”–¥n”;
            $mailBody.=$_SERVER[‘REMOTE_ADDR’].”¥n”;
            $mailBody.=date(“Y-m-d H:i:s”);
            
            $mailBody=str_replace(“¥r¥n”,”¥n”,$mailBody);
            $mailBody=str_replace(“¥r”,”¥n”,$mailBody);
  &nbsp
;         
            if(function_exists(‘mb_language’)){mb_language(‘Japanese’);}
            if(function_exists(‘mb_internal_encoding’)){mb_internal_encoding(get_option(‘blog_charset’));}
            if(function_exists(‘mb_send_mail’)){
              $result=mb_send_mail($mailRcpt,$mailSubj,$mailBody,”From: “.$mailFrom.”¥r¥n”);
            }else{
              $result=mail($mailRcpt,$mailSubj,$mailBody,”From: “.$mailFrom.”¥r¥n”);
            }
            if($result){
              $opType=”rslt”;
              $_SESSION[‘cwcf’][‘sent’]=$now;
            }
          }
        }else{
          foreach($this->params as $param){
            $values[‘val_’.$param]=$this->{’cwcfdef_’.$param};
          }
        }
        
        /*—————————————————————–*/
        $cwcfOutput=array();
        /*—————————————————————–*/
        $cwcfOutput[‘form’]=”;
        $cwcfOutput[‘form’].='<form method=”post” id=”cwcf” action=”‘.$_SERVER[‘REQUEST_URI’].'”>';
        if($errors){
          $cwcfOutput[‘form’].='<ul>';
          foreach($errors as $error){
            $cwcfOutput[‘form’].='<li>’.$error.'</li>';
          }
          $cwcfOutput[‘form’].='</ul>';
        }
        $cwcfOutput[‘form’].='<dl>';
        if($this->cwcfname_name){
          $cwcfOutput[‘form’].='<dt>’.$this->cwcfname_name.(($this->cwcfreq_name)? ‘<span class=”required”>*</span>':”).'</dt>';
          $cwcfOutput[‘form’].='<dd><input type=”text” name=”val_name” value=”‘.$values[‘val_name’].'” size=”30″ /></dd>';
        }
        if($this->cwcfname_mail){
          $cwcfOutput[‘form’].='<dt>’.$this->cwcfname_mail.(($this->cwcfreq_mail)? ‘<span class=”required”>*</span>':”).'</dt>';
          $cwcfOutput[‘form’].='<dd><input type=”text” name=”val_mail” value=”‘.$values[‘val_mail’].'” size=”30″ /></dd>';
        }
        if($this->cwcfname_addi){
          $cwcfOutput[‘form’].='<dt>’.$this->cwcfname_addi.(($this->cwcfreq_addi)? ‘<span class=”required”>*</span>':”).'</dt>';
          $cwcfOutput[‘form’].='<dd><input type=”text” name=”val_addi” value=”‘.$values[‘val_addi’].'” size=”30″ /></dd>';
        }
        if($this->cwcfname_subj){
          $cwcfOutput[‘form’].='<dt>’.$this->cwcfname_subj.(($this->cwcfreq_subj)? ‘<span class=”required”>*</span>':”).'</dt>';
          $cwcfOutput[‘form’].='<dd><input type=”text” name=”val_subj” value=”‘.$values[‘val_subj’].'” size=”30″ /></dd>';
        }
        if($this->cwcfname_text){
          $cwcfOutput[‘form’].='<dt>’.$this->cwcfname_text.(($this->cwcfreq_text)? ‘<span class=”required”>*</span>':”).'</dt>';
          $cwcfOutput[‘form’].='<dd><textarea name=”val_text” cols=”35″ rows=”8″>’.$values[‘val_text’].'</textarea></dd>';
        }
        $cwcfOutput[‘form’].='<dt>&nbsp;</dt>';
        $cwcfOutput[‘form’].='<dd><input type=”submit” value=”‘.$this->cwcfdef_subm.'” /></dd>';
        $cwcfOutput[‘form’].='</dl>';
        $cwcfOutput[‘form’].='</form>';
        /*—————————————————————–*/
        $cwcfOutput[‘rslt’].=get_option(‘cwcfmsg_success’);
        /*—————————————————————–*/
        $_SESSION[‘cwcf’][‘send’]=1;
     return preg_replace(‘|{cwcf}|’, $cwcfOutput[$opType], $content);
   }
    }
    
    function admin()
    {
      add_options_page(‘options-general.php’, ‘CWCF’, 8, basename(__FILE__), array(&$this,’processAdmin’));
    }
    
    function processAdmin()
    {
      $fields=array();
      $fields[‘name’]=array(‘title’=>’Name’,    ‘value’=>”,  ‘required’=>’1′);
      $fields[‘mail’]=array(‘title’=>’Mail’,    ‘value’=>”,
  ‘required’=>’1′);
      $fields[‘addi’]=array(‘title’=>’Additional’,’value’=>”,  ‘required’=>’0′);
      $fields[‘subj’]=array(‘title’=>’Subject’,  ‘value’=>”,  ‘required’=>’1′);
      $fields[‘text’]=array(‘title’=>’Message’,  ‘value’=>”,  ‘required’=>’1′);
      foreach($fields as $field => $fieldValue){
        add_option(‘cwcfname_’.$field,addslashes($fieldValue[‘title’]));
        add_option(‘cwcfreq_’.$field,’0′);
        add_option(‘cwcfname_’.$field,addslashes($fieldValue[‘value’]));
      }
      add_option(‘cwcfdef_subm’,’submit’);
      $otherOptions=array();
      $otherOptions[‘cwcfmsg_required’]  =array(‘title’=>’Error message of “Required”‘,    ‘value’=>’This field is required.’);
      $otherOptions[‘cwcfmsg_format’]    =array(‘title’=>’Error message of “Email format”‘,  ‘value’=>’The format is wrong.’);
      $otherOptions[‘cwcfmsg_success’]  =array(‘title’=>’Thank you message’,        ‘value’=>’Thank you for your contact.’);
      $otherOptions[‘cwcfmail_from’]    =array(‘title’=>’Mail sender of contact form’,    ‘value’=>get_option(‘admin_email’));
      $otherOptions[‘cwcfmail_rcpt’]    =array(‘title’=>’Mail recipient of contact form’,  ‘value’=>get_option(‘admin_email’));
      $otherOptions[‘cwcfmail_subj’]    =array(‘title’=>’Mail subject of contact form’,    ‘value’=>’Contact from [‘.get_option(‘blogname’).’]’);
      foreach($otherOptions as $option => $optionData){
        add_option($option,$optionData[‘value’]);
      }
      
      if(strtolower($_SERVER[‘REQUEST_METHOD’])==’post’){
        foreach(array_keys($fields) as $field){
          update_option(‘cwcfname_’.$field,  $_POST[‘cwcfname_’.$field]);
          update_option(‘cwcfdef_’.$field,  $_POST[‘cwcfdef_’.$field]);
          update_option(‘cwcfreq_’.$field,  ($_POST[‘cwcfreq_’.$field]?$_POST[‘cwcfreq_’.$field]:’0′));
        }
        update_option(‘cwcfdef_subm’,$_POST[‘cwcfdef_subm’]);
        foreach(array_keys($otherOptions) as $option){
          update_option($option,$_POST[$option]);
        }
      }
      
      $values=array();
      foreach($this->prefixes as $prefix){
        foreach($this->params as $param){
          $values[$prefix.’_’.$param]=htmlspecialchars(get_option($prefix.’_’.$param));
        }
      }
      foreach(array_keys($otherOptions) as $option){
        $values[$option]=htmlspecialchars(get_option($option));
      }
      
      $cwcfOutput=”;
      $cwcfOutput.='<div class=”wrap”>';
      $cwcfOutput.='<h2>CWCF setting</h2>';
      $cwcfOutput.='<form name=”form1″ method=”post” action=”‘.$_SERVER[‘PHP_SELF’].’?page=cwcf.php”>';
      $cwcfOutput.='<table cellspacing=”2″ cellpadding=”5″ class=”editform”>';
      foreach($this->params as $param){
        if($param!=’subm’){
          $cwcfOutput.='<tr valign=”top”>';
          $cwcfOutput.='<td>Label of “‘.$fields[$param][‘title’].'”</td>';
          $cwcfOutput.='<td>';
          $cwcfOutput.='<input type=”text” name=”cwcfname_’.$param.'” value=”‘.$values[‘cwcfname_’.$param].'” size=”30″ /> ‘;
          $cwcfOutput.=’Require?:<input type=”checkbox” name=”cwcfreq_’.$param.'” value=”1″ ‘.(($values[‘cwcfreq_’.$param])? ‘checked ‘:”).’/><br />';
          $cwcfOutput.='</td>';
          $cwcfOutput.='</tr>';
          $cwcfOutput.='<tr valign=”top”>';
          $cwcfOutput.='<td>– Default value of “‘.$fields[$param][‘title’].'”</td>';
          $cwcfOutput.='<td>';
          $cwcfOutput.='<input type=”text” name=”cwcfdef_’.$param.'” value=”‘.$values[‘cwcfdef_’.$param].'” size=”40″ />';
          $cwcfOutput.='</td>';
          $cwcfOutput.='</tr>';
        }
      }
      $cwcfOutput.='<tr>';
      $cwcfOutput.='<td>Label of “Submit”</td>';
      $cwcfOutput.='<td><input type=”text” name=”cwcfdef_subm” value=”‘.$values[‘cwcfdef_’.$param].'” size=”40″></td>';
      $cwcfOutput.='</tr>';
      foreach($otherOptions as $option => $optionData){
        $cwcfOutput.='<tr>';
        $cwcfOutput.='<td>’.$optionData[‘title’].'</td>';
        $cwcfOutput.='<td><input type=”text” name=”‘
.$option.'” value=”‘.$values[$option].'” size=”40″ /></td>';
        $cwcfOutput.='</tr>';
      }
      $cwcfOutput.='</table>';
      $cwcfOutput.='<input type=”submit” value=”submit” />';
      $cwcfOutput.='</form>';
      $cwcfOutput.='</div>';
      echo $cwcfOutput;
    }
    
    function css()
    {
      $css=”;
      $css.='<style type=”text/css” media=”screen”>’.”¥n”;
      $css.=”#cwcf dl{margin:0em;font-size:100%;margin-top:0.5em}”.”¥n”;
      $css.=”#cwcf dt{float:left;width:10em;margin-bottom:0.8em;color:#555;text-align:right;font-weight:normal;position:relative;}”.”¥n”;
      $css.=”#cwcf dt .required{color:#f00;}”.”¥n”;
      $css.=”#cwcf dd{margin-left:10.5em;margin-bottom:0.8em;font-size:100%;font-style:normal;padding-left:0.5em;}”.”¥n”;
      $css.=”#cwcf dd.submit{margin-top:2em;}”.”¥n”;
      $css.=”</style>”;
      print($css);
    }
  }
  
  $cwcfObj=& new cwcf;
  add_action(‘admin_menu’,  array(&$cwcfObj,’admin’));
  add_filter(‘wp_head’,    array(&$cwcfObj,’css’), 2);
  add_filter(‘the_content’,  array(&$cwcfObj,’process’), 2);

mdb2でSQLいらず

2007/11/08 | その他PEAR全般

フレームワークやCMS、ブログツールを使ってシステム構築することがほとんどになってしまい、アレだけ大好きだったPEARを現在ではほとんど使っていない。今日、ふとPEARのマニュアルを見ていて便利なのを見つけた。
データベース接続のためのmdb2はSQLを書かなくてもSQLを実行できるのだ。もちろんDB_DataObjectなんかでも同様のことはできていたわけだが、これはもっとお手軽簡単だと思う。しかもプリペアードステートメントを使用するので値のエスケープも必要ない。こんな具合に記述するらしい。

事前に$mdb2というデータベースオブジェクトを作成しておいて・・・。
$tableName=’user';
$tableFields=array(‘id’,’name’,’password’);
$fieldTypes=array(‘integer’,’text’,’text’);
$mdb2->loadModule(‘Extended’);
$sth=$mdb2->extended->autoPrepare($tableName,$tableFields,$MDB2_AUTOQUERY_INSERT,null,$fieldTypes);

ここまでで準備完了。次にデータを用意して上記の$sthに放り込めばいい。
$values=array(1,’kaorun’,’himitsu’);
$result=& $sth->execute($values);

おのおのエラー処理は別途必要だが、SQLは書かなくていい。何より後々フィールド数が変わったりした場合でも変更が簡単だ。データ登録で複数行ついかしたかったらexecuteMultiple()を実行すればいい。
データを一行だけ登録するならautoExecute()を実行すればいい。こちらも同様に「SQLいらず」だ。

なにより、複雑な設定ファイルを記述しなくても「簡単な配列でテーブルを定義するだけでいい」ってのがサイコー。しかし・・・もっと昔に気づいていればなぁ。

どこでブラウザへの出力をしてしまったのかチェック

PHPの超便利関数を見つけたのでメモ。
headers_sent関数がそれ。

header関数を使おうと思ったら「headers already sent」なんていわれることがあるわけだが、この関数を使うと「もう何か出力したかどうか」をチェックすることができる。しかしこの関数のもっとすごいところは・・・どのファイルの何行目で出力があったのか教えてくれる点だ。
通常スクリプトを書くときは共通の処理を外部ファイルとするわけで、ある程度の規模になってくると当然ひとつの処理を実行するのにいくつものファイルをincludeすることが多々ある。こんなときに「headers already sent」なんていわれた日には、それこそ手当たり次第にrequireしているファイルを開いてチェックしなければならない。
しかしこの関数を使うと、どこで出力があったかわかってしまうのだ。実際には以下のように使用する。

bool headers_sent([string &file [, int &line]])

引数なしで使うと出力があったかどうかを判別するだけ。
第一引数を渡すと、すでに出力があった場合に、その第一引数の変数に出力があったファイル名を代入してくれる。さらに第二引数を渡すと、出力のあった行番号も代入してくれる。header関数で悩んでしまったら以下のようなスクリプトをheader関数の直前にでも入れてチェックすると、手っ取り早く出力箇所を特定できる。

if(headers_sent($fileName,$lineNumber)){
  exit(‘File Name: ‘.$filename.'(‘.strval($lineNumber).’)’);
}

まだまだ知らない関数がたくさんありそうだ。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net