01 / 本文
同じコードなのに、片方のサイトだけ警告が出た
WordPress に記事を一括投入した。公開ページは普通に表示され、エラーも出ない。しばらくして別のサイトを開いたら、画面の先頭に Attempt to read property "ID" on false が出ていた。
同じスクリプトで作った記事なのに、片方のサイトでは何も出ず、もう片方では画面に警告が出ていた。
02 / 本文
省略した引数の既定値が、壊れた状態だった
wp_insert_post() に post_author を渡していなかった。渡さないと 0 になる。存在しないユーザーIDだ。
テーマ側は get_userdata($post->post_author) の結果に ->ID を書いている。get_userdata(0) は false を返すので、PHP 8 では Warning になる。
省略できる引数は、省略すると既定値が入る。その既定値が「壊れた状態」であることがある。
03 / 本文
出ていない=正しい、ではない
違いはテーマだった。Cocoon は OGP を作るときに投稿者を触っていない。AFFINGER は article:author を出すために触る。
データの壊れ方は同じで、触るコードがあるかどうかの差でしかない。警告が出ていないサイトも壊れていた。
3サイトを調べたら合計143件あった。記事だけでなく、アイキャッチとして取り込んだ添付ファイルも全部そうだった。media_handle_sideload() も同じで、投稿者を指定しないと 0 になる。
04 / 本文
ノイズを消すフィルタは、いつか本物を消す
投入したあと wp-cli の出力は見ていた。ただ AFFINGER は wp-cli の標準出力にも Undefined global variable の警告を大量に吐く。常に出ているので grep -v warning で捨てる癖がついていた。
捨てるフィルタの中に、本物が混ざっていた。
正しい確認は、公開ページを実際に取得して grep することだった。管理側のログではなく、読む人に届いている HTML を見る。
コメント
この記事へのコメント
お名前だけで投稿できます。アカウント登録やログインは不要です。 いただいたコメントは確認のうえ公開します。