Posted by をかもと at 2009年1月8日 木曜日
yutaka さんが、ちょっと前から頻繁にコメントが承認待ちになると言っていたので、原因を調べてみました。
実はこの現象、私のサイトでも WordPress 2.7 にバージョンアップしてから、たびたび発生していました。
# おもに yutaka さんのコメント。
ちらっと WordPress のソースを眺めたところ wp-includes/comment.php の check_comment() 関数に問題があることがわかりました。
具体的には :D などのいわゆる smilies がコメント中に複数あると、必ず「承認待ち」になってしまいます。
# WordPress 2.7.1 以降のバージョンではこのバグは解決されたため、このプラグインは不要です。
で、どこが悪いかと言うと…
WordPress ではコメント内にn個のリンクが有る場合、コメントを「承認待ち」にする機能があります。
# デフォルトは2個以上のリンク。
このリンクを数える対象が WordPress 2.7 で微妙に変わってしまったのです。
ソースを見てもらえば分かりやすいのですが 2.6.5 までは "ユーザが入力した文字"、2.7からは "画面に表示する整形済みの html" に対してカウントしています。
WordPress 2.6.5 の wp-includes/comment.php
if ( preg_match_all("|(href\t*?=\t*?['\"]?)?(https?:)?//|i", $comment, $out) >= get_option('comment_max_links') )
return false; // Check # of external links
WordPress 2.7 の wp-includes/comment.php
if ( get_option('comment_max_links') && preg_match_all("|(href\t*?=\t*?['\"]?)?(https?:)?//|i", apply_filters('comment_text', $comment), $out) >= get_option('comment_max_links') )
return false; // Check # of external links
Custom Smilies などの smilies を入力するプラグインを導入している場合、ユーザが入力した smilies は<img src="http://example.com/wp-includes/images/smilies/icon_mrgreen.gif" 〜> などという img タグに変換されます。
で、この img タグの src プロパティの "http://example.com/wp-includes/images/smilies/icon_mrgreen.gif" もリンクとしてカウントされてしまうわけです。
結果「このコメントにはリンクがいっぱい含まれているからとりあえず「承認待ち」にしておきますよ」と WordPress が判定してしまいます。
お節介ですね。
これに対処するには wp-includes/comment.php を書き換えちゃえば良いんですが、WordPress コアのソースに手を付けるとバージョンアップの時とかメンドくさいです。
メンドくさいのは嫌いなので、簡単なプラグインを作りました。
<?php
/*
Plugin Name: Approved smilies for WP2.7+
Version: 0.1.1
Plugin URI: http://dogmap.jp/2009/01/08/wordpress-27-smilies-comment/
Description: コメント欄の笑顔を承認します
Author: wokamoto
Author URI: http://dogmap.jp/
License:
Released under the GPL license
http://www.gnu.org/copyleft/gpl.html
*/
function convert_internal_link($html_text) {
if (preg_match("|(href\t*?=\t*?['\"]?)?(https?:)?//|i", $html_text)) {
$base_url = untrailingslashit(preg_replace('/^(https?:\/\/[^\/]*\/).*$/i', '$1', get_bloginfo('wpurl')));
$pattern = '/(["\'])' . preg_quote($base_url, '/') . '(\/[^"\']*[^"\'])/i';
$html_text = preg_replace($pattern, '$1$2', $html_text);
}
return ($html_text);
}
add_filter('comment_text', 'convert_internal_link', 99);
?>
ダウンロードはこちらから。
http://dl.getdropbox.com/u/110305/approved-smilies-0.1.1.zip
プラグインの仕様としては、内部リンクをプロトコル・サーバ名を含んだ絶対パスから、プロトコル・サーバ名を含まない相対パスに書き換えます。
例:
"http://example.com/wp-includes/images/smilies/icon_mrgreen.gif"
↓
"/wp-includes/images/smilies/icon_mrgreen.gif"
これにより、同一サーバ上の URL へのリンクは check_comment() 関数では、リンクとしてカウントされないようになるので、結果として smilies がいくら含まれていようと「承認待ち」になることはありません。
つぶやく
こんばんわ〜、わたしはこれで幸せになれました
わ、わるかったなぁ 8)
これで煩わしさから解放されましたわ〜
私もコレで幸せになりましたー :D
ほかのプラグインも順調にうごいてますです。
yutaka さん、satchin さん、どもです。
幸せになった方が増えてなによりです。
みんなで幸せになりましょう。
と言うわけで Amazon で何か買うとき、たまに当ブログの Amazon リンク経由で買ってくれると私が幸せになります。
去年は Amazon のおかげで、格安で忘年会ができました :P
これはコアのバグと考えられるので、trac でチケットを切ってしまった方がいいと思いますよーー。
ゆりこさん、どもです。
やっぱり、コアのバグと見るべきですかねぇ。
今まで、無変更だった所を変更していたので 2.7からの仕様変更と受け取ったのですが…
こんにちはー。
あはは、これ。私のブログもそうだったのかも(笑)
なんでだろう?ま、いいか!
ってな感じですでに忘れてました :)
もう少し様子みてから、こちらの修正方法を参考にさせて頂きます.
endunham さん、どもです。
WordPress 2.7 にバージョンアップ後、yutaka さんのコメントだけ妙に「承認待ち」になるなぁとは思っていました。
実は最後まで投稿を読まずに前回コメント投稿してました
プラグインを頂きます。感謝!
endunham さん、どもです。
どうぞ、どうぞ。好きなだけ持っていってください。
comment.phpはいじりたくないけど、smiliesもやめたくないし、どうしょ…
と思っていた所でした :(
早速DLして使わせていただいております。
ありがとうございました :D
mai さん、はじめまして。
結構、この問題困ってる人が居るみたいですね。
まぁ、コアのバグっぽいので、そのうち直るでしょう。
このプラグインは、それまでの暫定的な処置ということで :P
プラグインを導入しようか迷っていたのですが
2.7.1でFIXされた
http://core.trac.wordpress.org/ticket/8627
でOKですよね?
違うのかな
WDJP さん、はじめまして。
おぉ、本当ですね。2.7.1 で FIX されてる。
この問題と一緒です。
では、2.7.1 からは、このプラグインは不要ですね。