Trying to get property… がcomment-template.phpで出る

WordPressのロゴ。

WordPress の wp-includes/comment-template.php ファイルから、「Trying to get property of non-object」が出力される場合、 コメントに関するテンプレートやプラグインの実装に誤りがある場合があります。

このエラー(PHP Notice ですが)の場合、エラーログからはプラグインやテンプレートの問題の箇所を発見できない問題があります。 とは言え、wp-includes/comment-template.php ファイルのどの関数からエラーが発生しているかを確認することで、ある程度は絞り込むことができます。

エラーコードの例

私の場合は次のようなエラーコードが出力されていました。WordPress の動作自体には問題がありません。

Trying to get property of non-object in /home/xjine/xn--lcki7of.jp/public_html/wp-includes/comment-template.php on line 1154

該当する comment-template.php のソースコードは次のように、comment-open 関数でした。 $open = ( 'open' == $_post->comment_status ); でエラーが発生しています。

function comments_open( $post_id = null ) {

	$_post = get_post($post_id);

	$open = ( 'open' == $_post->comment_status );

	return apply_filters( 'comments_open', $open, $post_id );
}

$_post が取得できないにもかかわらず、comment_status を参照しようとしたので、エラーが通知されている、と推測されます。

問題の原因と解決の例

今回の原因は、自作のテーマで、comments_open 関数だけを使用して、コメントを挿入するべきかどうかを判断していたために起こったことになります。 つまり、get_post() 関数によって、投稿高情報が取得できないページを開いてしまったときには、このエラーが発生している、ということです。

問題を解決する方法はいくつもありますが、最も無難な方法は、comments_open` 関数だけを使ってコメントの挿入を判断するのではなく、 comments_open 関数を使う前に、コメントが挿入されるページであるかどうかを判断する、という方法です。

条件判定が挟まる分だけパフォーマンスが低下しますが、やむを得ません。 あるいは、エラーを無視する手はありますが、配布予定のあるテーマやプラグインでこの問題が起こるなら、改善した方が良いでしょう。

基本的に、コメントが挿入される可能性があるのは次の 3 つのページです。

  1. 投稿ページ
  2. 固定ページ
  3. 添付ファイルのページ

これらのページであるかどうかを、comments_open 関数の前に判断すれば、今回の問題は解決することができます。 is_singular() 関数を使えばよいでしょう。

Reference

同じような問題にあたっている方がチラホラ見られます。WordPress 側でエラーを巻いてしまった方が良いパターンた気がしますが、設計としては何とも言えないところですね。

wp-includes/comment-template.php:26 - Trying to get property of non-object - StackExchange