Ktai Entry よくある質問と答え

初出日: 2008年4月29日 | 最終更新日: 2010年3月5日
投稿者: ゆりこ | パーマリンク

[ Ktai Entry | よくある質問と答え | エラーメッセージ ]

Ktai Entry に関して、附属ドキュメントに掲載されていない疑問点やノウハウなどを掲載します。ここにない質問があれば、まず、附属ドキュメントをよく読んでみてください。それでも解決できなければ、作者にメールするか、WordPress 日本語フォーラム の「プラグイン」で質問してください。

インストール関連

プラグインを有効にすると “Fatal Error” になる
サーバーの PHP バージョンが 5.0.0 以降であるか確認してください。Ktai Entry は PHP 4.4.8 以前には対応していません。以下のエラーが出るときは確実にサーバーの PHP が 4.x です。

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or
T_FUNCTION or T_VAR or ‘}’ in /****/wp-content/plugins/ktai_entry/ktai_entry.php
on line 68

おそらく PHP 5.0.x, 5.1.x でも動作するはずですが、動作確認はしていません。もし動かない場合は PHP 5.2.x 系統にアップグレードしてください。

管理画面の設定をどう変更すればいいか分からない
管理画面の「メール投稿」での設定は変更しなくてもそのまま使えます。メールサーバーの設定さえきちんと行えばデフォルトで動くように設計されています。
外部メールボックスの読み込みを cron で行なわせたい
手動でメールボックス確認させる スクリプト retrieve.php をウェブ経由でアクセスする (wget コマンド等) 場合は _wpnonce 引数が必須ですが、コマンドライン版 PHP で retrieve.php を起動させる場合は不要です。このため、crontab は以下のように記述してください。なお、/PATH/TO の部分は適宜修正してください。

2,17,32,47 * * * * /usr/bin/php /PATH/TO/retrieve.php

※0,15,30,45 ではないのは、他の cron ジョブが使わなさそうな時刻にするためです。
※”retrieve” のスペルは間違えやすいので、十分注意してください。

仕様に関して

添付できる画像は何枚までか
スクリプト側では特に制限を設けていません。au 携帯は5枚まで、SoftBank 6-3 シリーズだと1枚だけなど、端末側の制約の方が大きいでしょう。ただし、大きい画像を複数枚添付すると、PHP のメモリ制限をオーバーして異常終了することがあります。PHP のメモリ制限は 32MB 以上にしておくことをおすすめします。(WordPress 2.5 以降は、自動的にメモリ制限が 32MB 以上に設定されます)
画像以外を添付できるか
現状では、JPEG, PNG, GIF 画像以外の添付には対応していません。動画の添付は将来のバージョンで検討します。
画像のファイル名はどうなるか
原則として、元のファイル名そのままです。同じファイルが存在するときは _2, _3, … と追番がつきます。ファイル名に使用できない記号類は削除します。使える記号は、ハイフン(-)、アンダースコア(_)、ドット(.)、チルダ(~)、プラス(+) だけです。
サーバーへの負荷はどれぐらいか
外部メールサーバーに随時アクセスする場合でも、今どきのサーバーならば、POP アクセスを5分間隔に詰めてもさほど負荷にならないはずです。投稿専用メールアドレスならば、基本的にメールボックスが空なので数秒でチェック終了します。しかし、他のメールと兼用しているメールボックスで、常に数千通ぐらい溜っている場合は、5分間隔だとまずいかもしれません。
メール着信時に投稿スクリプトを起動する場合は、CLI 版 PHP のプロセスが走るだけなので非常に軽いでしょう。
不許可アドレスからの投稿はどうなるか
不許可アドレスから投稿があった場合、以下のように処理されます。
  • 外部メールボックスに随時アクセスする方式では、メールを読み出さずスキップします (メールボックスに残ります)。このため、投稿用メールボックスを他の用途と兼用することは一応可能です (おすすめしません)。逆に、投稿専用メールアドレスとしている場合、不許可アドレスからのメールが溜っていくため、適宜メーラー等で受信して削除しておいてください。
  • メール着信で投稿スクリプトを起動する方式の場合、表書き差出人に返送します。
投稿を認証するパスフレーズはないのか
他のツールでは、メール本文や題名に特定のパスフレーズ (文字列) があるかどうかで投稿を認証する仕組みがありますが、Ktai Entry では採用していません。投稿受け付けメールアドレスを秘匿すること、差出人メールアドレスを WordPress 登録ユーザーに限定することで十分スパム対策になると考えています。両方のアドレスをある程度複雑にしておけば、スパマーに詐称されることはないと思います。
絵文字投稿はどのキャリアに対応しているか
絵文字投稿は、キャリアおよび投稿送信先メールボックスによって対応が異なります。
  • au、ウィルコム: 送信先メールボックスによらず対応しています。メール着信で投稿スクリプトを起動する方式も使えます。
  • ドコモ、ソフトバンク: Gmail, au one メール、Yahoo! メールに送信する場合のみ対応しています。メール着信で投稿スクリプトを起動する方式を使う場合、これらのサービスから自身のメールサーバーに転送させ、携帯電話からは Gmail 等にメール送信してください。
  • イー・モバイル:Gmail, au one メールに送信する場合のみ対応しています。メール着信で投稿スクリプトを起動する方式を使う場合、これらのサービスから自身のメールサーバーに転送させ、携帯電話からは Gmail 等にメール送信してください。

残念ながら、これ以外の場合は、メールをインターネットに中継する時点で絵文字を〓 (ゲタ)、? (はてな) やテキスト ([人差し指] など) に変換してしまいます。メールサーバーに到着した時点で絵文字は失なわれていて、Ktai Entry では認識できないため、絵文字投稿はできません。

ログを日本語化したい
ログ機構は、文字化けして内容が読めなくなることを防ぐため、デフォルトでは英語としていますが、ktai_entry.php の 77 行目のコメントを外して「$this->load_textdomain('ktai_entry_log', 'lang');」を有効にすると日本語化できます。文字コードはウェブログの文字コード (UTF-8 等) と同じです。ただし、メールサーバーに返答するためのメッセージ、および外部のメールボックスから返されたメッセージは英語のままです。

問題が発生したときは

投稿処理がされない
さまざまな原因が考えられます。以下をそれぞれ確認してください。
  • プラグインが有効になっているか確認してください。他のメール投稿ツールを使っている場合、無効にしたり削除したりしてください。
  • 外部メールボックスにアクセスするサーバーアドレス、ログイン名、パスワードを確認してください。また、APOP 必須のサーバーの場合、APOP オプションにチェックを入れてください。Gmail の場合は、メールサーバーが「ssl://pop.gmail.com」であり、ログイン名に「@gmail.com」をつけていることを確認してください。
  • Gmail を使う場合、PHP に openssl が組み込まれているか確認してください。Bad Gateway エラーで POP3 connect: Error [152892360] [Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?] のようなメッセージが出る場合は、SSL が組み込まれていません。
  • Gmail の場合、POP を使う設定にしているか確認してください。また、POP のアクセス過多によって、アカウントがロックされていることがありますので、ロック解除を試してみてください。
  • 投稿者のメールアドレスが、ウェブログに登録ずみで、投稿者 (contributor) 以上の権限があるか確認してください。もしくは、投稿が「レビュー待ち」または「下書き」になってないか確認してください。ユーザーが投稿者の場合は、公開になりません。
  • WILLCOM 端末の中には、メール投稿日時が端末の日付となるものがあります。PC からメール投稿した場合は、PC の日付が投稿日時となります。時計が進みすぎている場合「予約投稿」扱いになって、すぐには公開されません。もしくは、古い日付になっていると、相当古い記事として投稿されてしまいます。時計を合わせてください。
  • 閲覧者がプロキシーサーバーを使っていて、メールボックス読み出し用スクリプトがキャッシュにヒットした場合、実際にスクリプトにアクセスされないため読み出し処理が行なわれません。直接ウェブログにアクセスし、ブラウザーのキャッシュもクリアしてみてください。
  • メール着信で投稿スクリプト inject.php を起動させる方式の場合、inject.php へのパスが正しいか確認してください。| /usr/bin/php /PATH/TO/inject.php ではなく、| /PATH/TO/inject.php としないと動かない場合があります。この場合は、inject.php の先頭に #! /usr/bin/php を記載して、実行権限を与えてください。
  • inject.php を起動させる方式の場合、および cron で retrieve.php を起動させた場合、CLI 版の PHP バージョンを確認してください。サーバーによっては、Apache モジュール版 PHP が 5.0 以降であっても、CLI 版が 4.x であるという場合もあり得ます。CLI 版 PHP をアップグレードしてください。

原因が不明の場合、ktai_entry.php の 27,28 行目にある define('KE_LOGFILE', 'logs/error.log'); define('KE_DEBUG', TRUE); のコメントを外して詳細のログ記録を有効にしてみてください。これで問題発生個所が分かるかもしれません (ログは英文のみです。あしからず)。

画像が保存されない
uploads ディレクトリーのオーナー (所有者) および パーミッション (アクセス権限) を確認してください。WordPress が自動作成した場合、オーナーがウェブサーバー (www-data など) で、パーミッションは 757 もしくは 777 になっています。755,757 の場合、「メール着信したら投稿スクリプトを起動」方式ではスクリプトの実行ユーザーが HOME ディレクトリーのオーナーとなり、ディレクトリーのオーナーと異なるため、ファイルが保存できないことがあります。ディレクトリーの権限を 777 に変更してみてください。
PHP のセーフモードを利用している場合など、サーバーの設定によってはディレクトリーの自動生成ができない場合があります。この場合は、手動で wp-content/uploads/2008/10/ のように年月ごとのディレクトリーを作成し、パーミッションを 757 等にしておいてください。
画像が表示されない
LightBox 用に、rel=”lightbox” 属性を追加する」を適用している場合、バージョン 0.8.0 までの附属ドキュメントに記載していたコードはバグっているので、このドキュメントに掲載しているコードに差し替えてください。
Lightbox 用カスタマイズではないが、同様にフィルター関数を使ったカスタマイズをしている場合、フィルター関数がきちんと値を返しているか確認してください。返り値がないと、フィルター結果が「空」になるため不具合が出ます。
絵文字が出ない
絵文字は Ktai Style の絵文字フォーマットである <img localsrc=”XXXX” /> という書式で保存されます。このため、Ktai Style をインストールしていないと単なる img 要素となり、何も表示されません。Ktai Style をインストールすれば、携帯電話からは各キャリアの絵文字に、PC からはテキストに変換されて表示されます。
au, ウィルコムは投稿受け付けするメールサーバーを問わず絵文字が使えますが、ドコモ、ソフトバンク、イー・モバイルは Gmail, Yahoo! メール など、iモード絵文字がそのまま送信できるメールサーバー限定です。他の端末・サーバーでは絵文字が 〓 (ゲタ)、? (はてな) やテキスト文字列に変換されてしまうため、絵文字として認識されません。
動作ログに記録が残らない
define('KE_LOGFILE', 'logs/error.log'); のコメントを外して有効にした場合に動作ログが有効になりますが、パーミッションの設定によっては、ログが作られない場合があります。特に、外部メールボックス読み込み方式と、メール着信でスクリプトを起動する方式を併用している場合は、両者でプロセスオーナーが違うため、問題が起きやすいです (前者は Apache, 後者は HOME ディレクトリーのオーナー)。あらかじめ以下のようにしてログファイルを作成しておくのが無難です。

mkdir logs
chmod 0777 logs/;
touch logs/error.log
chmod 1666 logs/error.log
キーワードタグが重複されて生成された
WordPress 2.6.1 より前のバージョンでは、タグ機能の仕様により、タグ名から自動生成されるタグスラッグを別のものに変更したときに、同じタグ名 (で、自動生成されるタグスラッグを持つもの) が生成される不具合があります。Ktai Entry のタグ入力機能でも同じ問題が発生します。例えば、「変なモノ」タグに「funny」というスラッグを割り当てている場合、「TAG: 変なモノ」というコマンドを使うと「変なモノ」タグがもう1つ生成されてしまいます。これを避けるには、コマンドではタグスラッグを用いて「TAG: funny」と入力しなければなりません。WordPress 2.6.1 以降で改善されたものの、条件によってはまだ現象が発生することがあります。)
また、ウェブログの文字コードが UTF-8 の場合、波ダッシュ (〜) を持つタグで問題が発生します。Windows で全角チルダ U+FF5E (~) を含むタグを作った場合、メールで入力した波ダッシュは U+301C の「〜」に変換されるため、違うタグと認識されて別のタグになってしまいます。
画像に白い枠がつかない
Internet Explorer 5.5 以前および、Internet Explorer 6 の互換モードでは、スタイルシートの解釈に問題があり、画像周囲の枠がつきません。使用しているテーマの header.php を編集して、先頭に <?xml… という行 (XML 宣言) があれば、削除してください。これにより、Internet Explorer 6 では標準準拠モードとなり、正しく閲覧できます。Internet Explorer 5.5 以前のユーザーに対しては、IE 6 以降にアップグレードしてもらってください。
投稿時刻指定すると時刻が狂う
投稿先のサーバーが海外にある場合など、サーバーのタイムゾーンが投稿者の現地時間と異なる場合、投稿時刻の指定が狂うことがあります。これは、時刻指定コマンドが、サーバーのタイムゾーンに従って時刻を解釈するためです。これを回避するには、時刻指定にタイムゾーン (+0900 などの文字列) を付加してください。例えば、日本時間の 2008年7月11日00時00分 を強制する場合は「DATE:2008-07-11 00:00+0900」とします。

メール投稿に関するコツ

コマンドを単語登録する
カテゴリー指定コマンドや画像回転コマンドを、あらかじめ携帯電話で単語登録しておくと便利です。例えば、以下のような例が考えられます。
  • 「かて」→「CAT:」
  • 「ついか」→「CAT+」
  • 「たべもの」→「CAT:食べ物」
  • 「みすど」→「TAG:ミスタードーナツ,」
  • 「かいてん」→「ROT:L」「ROT:R」
  • 「したがき」→「DRAFT」
  • 「にちじ」→「DATE:1」
画像を右寄せにする
インストール説明で紹介した CSS は画像が左寄せですが、右寄せにするには以下のようにしてください。(right と left を入れ替えただけです)

.photo {
	padding-left:6px;
	float:right;
	line-height:110%;
	font-size:0.85em;
	text-indent:0;
}
.photo img {
	background:white;
	margin:0 0 4px 4px;
	padding:3px;
	border:1px solid #999;
}
.photo-end {
	clear:left;
}
独自フィルター image_link を使えば、Ktai Entry を改造しなくても可能です。my-hacks.php に以下のコードを書いてください。※バージョン 0.80 までに添付していたコードはバグっていたので以下のものに差し替えてください。

function ke_rel_lightbox($html, $id, $size) {
	if (preg_match('/rel=["\']/', $html, $match)) {
		$html = str_replace($match[0], $match[0] . 'lightbox ', $html);
	} elseif (! preg_match('/rel=/', $html)) {
		$html = str_replace('<a ', '<a rel="lightbox" ', $html);
	}
	return $html;
}
add_filter('image_link/ktai_entry.php', 'ke_rel_lightbox', 10, 3);
投稿許可アドレスを別途定義する
ウェブログ登録ユーザーのメールアドレス以外から投稿を受け付けたいときは、validate_address フィルターを使うと可能です。my-hacks.php に以下のコードを書いてください。$authors 配列は、許可するメールアドレスと対応するユーザー ID を示すものです。適宜修正してください。

function ke_another_author($user_id, $address) {
	$authors = array(
		'foo@example.com' => 1,
		'bar@example.net' => 4,
	);
	return isset($authors[$address]) ? $authors[$address] : $user_id;
}
add_filter('validate_address/ktai_entry.php', 'ke_another_author', 10, 2);
投稿者は固定したい
メールアドレスから決められた投稿者ではなく、誰か1人に投稿者を固定させたいときは、validate_address フィルターを使うと可能です。my-hacks.php に以下のコードを書いてください。携帯電話メールアドレスをユーザー登録したものの、投稿者は普段のものとしたい場合に使えます。以下の例はユーザー ID = 1 のユーザーに固定させる場合です。

function ke_fix_author($user_id, $address) {
	return $user_id ? 1 : 0
}
add_filter('validate_address/ktai_entry.php', 'ke_fix_author', 10, 2);
登録ユーザーの一部は投稿不可としたい
ウェブログ登録ユーザーであってもメール投稿を禁止したい場合、validate_address フィルターを使うと可能です。my-hacks.php に以下のコードを書いてください。$restricts 配列は、禁止するユーザー ID を示すものです。適宜修正してください。

function ke_restrict_author($user_id, $address) {
	$restricts = array(2, 10);
	return in_array($user_id, $restricts) ? 0 : $user_id;
}
add_filter('validate_address/ktai_entry.php', 'ke_restrict_author', 10, 2);
講読者はすべてメール投稿可能としたい
PC の管理パネルでは、講読者 (subscriber) に投稿権限はありませんが、メール投稿は許可したい場合、post_status フィルターを使うと可能です。my-hacks.php に以下のコードを書いてください。

function ke_allow_mailpost($status, $can_pending, $user_id, $address) {
	if (! $user_id) {
		return $status;
	}
	$user = get_userdata($user_id);
	if ($user->user_level >= 1) {
		$status = 'publish';
	}
	return $status;
}
add_filter('post_status/ktai_entry.php', 'ke_allow_mailpost', 10, 4);
メール投稿されたら管理者にメールが届くようにしたい
複数の投稿者がいるウェブログなど、メール投稿されたときに管理者にメールで届くようにしたい場合は、my-hacks.php に以下のコードを書いてください。管理者の ID が 1 でない場合は、WP_User(1) の部分を管理者の ID 番号に変更してください。以下のサンプルコードに対応する日本語リソースは Ktai Entry に組み込みずみですので、メッセージは日本語になります。

function ke_notify_publish($post_id) {
	if (! $post_id) {
		return $post_id;
	}
	$admin = new WP_User(1);
	$post = get_post($post_id);
	$poster = new WP_User($post->post_author);
	$blogname = get_option('blogname');
	$message = __('New post on your blog.', 'ktai_entry') . "\r\n";
	$message .= sprintf(__('Title: %s', 'ktai_entry'), $post->post_title) . "\r\n";
	$message .= sprintf(__('Author: %s', 'ktai_entry'), $poster->display_name) . "\r\n\r\n";
	$message .= __('You can see the post here:', 'ktai_entry') . "\r\n";
	$message .= get_permalink($post->ID) . "\r\n";
	$message .= sprintf(__('Edit it: %s', 'ktai_entry'), get_option('siteurl') .
	"/wp-admin/post.php?action=edit&post=$post->ID") . "\r\n";
	$subject = sprintf(__('[%1$s] New Post: "%2$s"', 'ktai_entry'), $blogname, $post->post_title);
	$wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
	$headers = "From: \"$blogname\" <$wp_email>\n"
	. "MIME-Version: 1.0\n"
	. "Content-Type: text/plain; charset=ISO-2022-JP\n";
	if (function_exists('mb_language') && function_exists('mb_internal_encoding') && function_exists('mb_send_mail')) {
		mb_language('Japanese');
		mb_internal_encoding(get_bloginfo('charset'));
		mb_send_mail($admin->user_email, $subject, $message, $headers);
	} else {
		wp_mail($admin->user_email, $subject, $message, $headers);
	}
}
add_action('publish_phone', 'ke_notify_publish');
VGA 以上のサイズなら画像を右回転させたい
通常、携帯電話のカメラ画像は、モバイルモード (VGA未満) の場合縦向き (ポートレイト) で、デジタルカメラモード (VGA 以上のサイズ) なら横向き (ランドスケープ) となります。この場合、端末を縦方向のまま VGA 以上の画像サイズで撮影すると、左回転した状態になってしまいます (端末によっては右回転)。画像を縦向きにしたい場合は、右回転 (または左回転) させる必要があります。都度回転コマンドを入れるのが面倒な場合、以下のコードを my-hacks.php に書けば、画像サイズを認識して画像を自動回転させます。

ke_rotate_vga($rotations, $rot_direction, $images) {
	if (count($rotations) && function_exists('imagecreatefromstring')) {
		for ($i = 0 ; $i < count($rotations) ; $i++) {
			if (! isset($rotations[$i]) || $rotations[$i] != 'N') {
				continue;
			}
			$image = imagecreatefromstring($images[$i]['body']);
			if (! $image) {
				continue;
			}
			$width  = imagesx($image);
			$height = imagesy($image);
			if ($width > $height && $width >= 640 && $height >= 480) {
				$rotations[$i] = 'R';
				// $rotations[$i] = 'L';
			}
		}
	}
	return $rotations;
}
add_filter('image_rotate/ktai_entry.php', 'ke_rotate_vga', 10, 3);

なお、端末によっては、撮影時のカメラ位置を判断して適切な向きに直すので、上記のコードは不要です。