wordpressで記事が削除されたと出る件

wpで管理してる記事が削除されていると出る。
ちょっと雰囲気が違うのは、have_postでコケてること。
permanent_structureを使っているのでcanonical.phpでリダイレクトさせないようにして?p=1234でアクセスすると、single.phpのhave_postがfalseを返してきている。
permanent_structureでアクセス、もしくはcanonicalでリダイレクトすると404ページに飛ばされる。

最初は原因不明だった。memcacheによるキャッシュを利用していた(object-cache.php)んだけど、これの動作がちょっとわかりにくいし、発生し始めたのがキャッシュを利用し始めた時期とかぶる。
試しにmemcacheでキャッシュの中身を見てみると、key: “wp_:posts:1234″はちゃんとある。これがあるって事は記事が存在するはず。DBの中を見てみると記事がある。
どこでこけてるか確かめてみると、post.phpの途中、L2295あたりにある

if ( !empty($this->posts) && ($this->is_single || $this->is_pag\
e) ) {

この辺。

if ( !empty($this->posts) && ($this->is_single || $this->is_pag
e) ) {
if ( ('publish' != $status) ) {
 if ( ! is_user_logged_in() ) {

この三段階の条件を見事スルーして記事が無いように見えてしまうらしい。
他の正常な記事だと途中で条件から抜けてる。
ちなみにこの後に待っているのは

$this->posts = array();

で、これが入っちゃうからpost_countが0になるらしい。それでhave_post()がfalseになる。
よく記事の内容を見てみるとpost_statusがtrashになってる。trashってのは見たことが無かった。
post.phpにwp_trash_post()の定義が。見ると2.9.0で実装されたらしい。
この関数はwp_delete_post()から呼ばれるらしい。
外部で削除の制御、記事の追加を行っていたのだけど、削除の時はwp_delete_post()を使って、挿入は手動で行っていたのでそうなっちゃったぽい。
ひとまずはpost_statusを全部publishにして対処。insert周りをいじるのは大変かも。
以上。

コメントを残す