comment_textフックに登録した関数内でget_comment_type()を実行するとエラー
-
フィルター comment_text は同じ名前で2種類ありますが、escape_comment_html はどちらへフックさせるものですか?
https://developer.wordpress.org/reference/hooks/comment_text/wp-includes/comment-template.php#L939
function comment_text の中でecho apply_filters( 'comment_text', $comment_text, $comment, $args );
wp-includes/comment.php#L39
function check_comment の中で$comment = apply_filters( 'comment_text', $comment );
gblsmさん、ご回答ありがとうございます。
初めて知りましたが、同名のフィルターが2つあるんですね。
私の認識ではfunction comment_textにフックさせているつもりです。
また、現在コメントを承認制にしておらず、またその予定もないのでcheck_commentの方にフックさせるつもりはありません。もしかするとフック先がおかしかったのでしょうか?
いいえ、フック先がおかしいというわけではありません。そもそも同じ名前で引数が違うフィルターがあること自体がちょっと変だなと思ってお尋ねしただけです。
新規コメントを入れた直後は、承認が必要なコメントかどうか判定するために function check_comment の方が(function comment_text よりも先に)呼ばれます。その時点ではコメントがまだデータベースへ登録されていないので、get_comment_type() ではコメントの種類を取得できません。function get_comment_type の内部でいうと、get_comment から null(コメントオブジェクトが見つからない)が返されます。
これはフィルターが呼び出されるタイミング上、止むを得ないと思います。ですので escape_comment_html のコードを次のように変えてはどうでしょう。
function escape_comment_html( $s ) { $c = get_comment(); // 新規コメントは null が返される if ( empty( $c ) || get_comment_type( $c ) === 'comment' ) { $s = esc_html( $s ); } return $s; }
同名のフィルターがあるのは、フックする関数の方で対処が可能だそうです。探すと下記のtracチケットに例が載っていましたので、ご参考まで。
#24913 (comment_text filter used differently in two places in core) — WordPress Trac確かに、同じ名前のフィルターというのは不可思議ですし、紛らわしいですね。
書いて下さったコードを試みたところ、コアファイルを修正することなく無事コメントを投稿できるようになりました。
ありがとうございます。
新規の投稿であるかどうかをそのようにして条件に加えたら良かったのですね。ちなみに、最初にget_commentでコメント情報が取得できないのなら$sの中身(コメント)も存在しないのではと安直に考えてしまったのですが、これは関数の実行されるタイミングの問題と見て良いですか?(うまく言葉を整理出来ませんが…)
同名のフィルターがあるのは、フックする関数の方で対処が可能だそうです。
第二引数がnullならcheck_comment(DBに挿入されたとき?)、nullじゃなければcomment_text(表示するとき)というように対処するという事でしょうか…?
最初にget_commentでコメント情報が取得できないのなら$sの中身(コメント)も存在しないのでは
整理すると次のようになります。
- 新規コメントは、データベースへ書き込む前に関数 check_comment で中身(テキストだけ)がチェックされます。このときにフィルター comment_text は引数が1つ、中身(コメントの文字列)だけが渡されます。
- コメントを表示するときは関数 comment_text が使われます。これはデータベースへ保存済みのコメントが対象なので、フィルター comment_text に3つの引数(1番めの引数は フィルター comment_text 経由のときと同じくコメントのテキスト)が渡されます。
第二引数がnullならcheck_comment(DBに挿入されたとき?)、nullじゃなければcomment_text(表示するとき)というように対処するという事でしょうか…?
例えば:
function escape_comment_html_new( $comment_text, $comment = null ) { if ( $comment !== null && get_comment_type( $comment ) === 'comment' ) { $comment_text = esc_html( $comment_text ); } return $comment_text; } add_filter( 'comment_text', 'escape_comment_html_new', 9, 2 );
- トピック「comment_textフックに登録した関数内でget_comment_type()を実行するとエラー」には新たに返信することはできません。
(@6flat)
8年、 5ヶ月前
functions.phpに追加した次のコードでコメントを出力する前にエスケープしているのですが、コメントの新規投稿時にエラーが出てしまいました。
エラー内容
comment-template.phpの該当箇所を次のようにするとエラーは出なくなったのですが、これはWordPressの不具合なのでしょうか?
それとも、私がフィルターに登録した関数がまずかったのでしょうか?
また、コアファイルを編集せずに対処する方法があればそちらも知りたいです。
よろしくお願い致します。