WordPress 2.7 で smilies 入りのコメントが承認待ちになる

yutaka さんが、ちょっと前から頻繁にコメントが承認待ちになると言っていたので、原因を調べてみました。
実はこの現象、私のサイトでも WordPress 2.7 にバージョンアップしてから、たびたび発生していました。
# おもに yutaka さんのコメント。

ちらっと WordPress のソースを眺めたところ wp-includes/comment.phpcheck_comment() 関数に問題があることがわかりました。
具体的には 😀 などのいわゆる 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: https://dogmap.jp/2009/01/08/wordpress-27-smilies-comment/
Description: コメント欄の笑顔を承認します
Author: wokamoto
Author URI: https://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*?&#91;'\"&#93;?)?(https?:)?//|i", $html_text)) {
		$base_url = untrailingslashit(preg_replace('/^(https?:\/\/&#91;^\/&#93;*\/).*$/i', '$1', get_bloginfo('wpurl')));
		$pattern = '/(&#91;"\'&#93;)' . preg_quote($base_url, '/') . '(\/&#91;^"\'&#93;*&#91;^"\'&#93;)/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 がいくら含まれていようと「承認待ち」になることはありません。

WordPress 2.7 で smilies 入りのコメントが承認待ちになる」への14件のフィードバック

  1. ピンバック: さんくす〜 - あーら、そう? 2nd GIG          

  2. をかもと 投稿作成者

    mai さん、はじめまして。

    結構、この問題困ってる人が居るみたいですね。
    まぁ、コアのバグっぽいので、そのうち直るでしょう。
    このプラグインは、それまでの暫定的な処置ということで 😛

    返信
  3. mai

    comment.phpはいじりたくないけど、smiliesもやめたくないし、どうしょ…
    と思っていた所でした 🙁
    早速DLして使わせていただいております。
    ありがとうございました 😀

    返信
  4. をかもと 投稿作成者

    endunham さん、どもです。

    あはは、これ。私のブログもそうだったのかも(笑)
    なんでだろう?ま、いいか!
    ってな感じですでに忘れてました 🙂

    WordPress 2.7 にバージョンアップ後、yutaka さんのコメントだけ妙に「承認待ち」になるなぁとは思っていました。

    返信
  5. endunham

    こんにちはー。

    # おもに yutaka さんのコメント。

    あはは、これ。私のブログもそうだったのかも(笑)
    なんでだろう?ま、いいか!
    ってな感じですでに忘れてました 🙂
    もう少し様子みてから、こちらの修正方法を参考にさせて頂きます.

    返信
  6. をかもと 投稿作成者

    ゆりこさん、どもです。
    やっぱり、コアのバグと見るべきですかねぇ。
    今まで、無変更だった所を変更していたので 2.7からの仕様変更と受け取ったのですが…

    返信
  7. をかもと 投稿作成者

    yutaka さん、satchin さん、どもです。

    幸せになった方が増えてなによりです。
    みんなで幸せになりましょう。

    と言うわけで Amazon で何か買うとき、たまに当ブログの Amazon リンク経由で買ってくれると私が幸せになります。
    去年は Amazon のおかげで、格安で忘年会ができました 😛

    返信
  8. yutaka

    こんばんわ〜、わたしはこれで幸せになれました 😳

    # おもに yutaka さんのコメント。

    わ、わるかったなぁ 8)

    これで煩わしさから解放されましたわ〜 :mrgreen:

    返信

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください