WordPress 3のカスタム投稿タイプ定義のクラス化で小一時間悩んだ件。

WordPress3のカスタム投稿タイプ(Custom Post Type)で、投稿タイプを定義するクラス(と、Meta Boxを定義するクラス)をテーマのfunctions.phpから分離していたところ、カスタムフィールドの保存でつまずいた。
save_postをフックしてカスタムフィールド(Meta Box)の保存をしたいのだがどうしてもうまく行かない。
やりたいことはこうだ。
テーマのfunctions.phpからCustom Post Typeを定義するクラスを呼び、そのクラスの中でMeta Boxを定義するクラスを呼ぶ。
パラメータはfunctions.phpに全部定義して、Custom Post Typeを定義するクラスに渡すようにする。

調べると、Custom Post Typeの定義と、Meta Boxの値の読み込み・表示は問題ない。
だが、投稿の保存でデータがpostされ、Meta Boxの値を更新をしたいときに、Meta Box のクラスが生成されず、
Post処理の後、リダイレクトされてpost.php?postid=IDがgetされる時(とadmin-ajax.phpがgetされる時)は呼ばれるらしい。

2日ほど悩んだ末、ついに解決した。
Custom Post Type 用クラスでadd_post_type を呼ぶ時に register_meta_box_cb で Meta Box を作っていると、なぜか投稿の保存のとき(?だと思う。未検証)には register_meta_box_cb のコールバック関数が呼ばれず、したがってMeta Boxの保存するメソッドも呼ばれず、というわけらしい。
Custom Post Type用クラスの初期化でもれなくMeta Boxを呼ぶようにしたら、あっさり解決した。

仕様なのかどうか分からないが、こんな簡単なことで悩んでどっと疲れてしまったので、検証する気もなくなってしましました。
だれか教えて偉い人!

Leave a Reply