WordPressでXMLRPC投稿時にカテゴリーを自動で設定したいという相談がありちょっと調べてみた。
WordPressでカテゴリー作成するには,通常管理画面から行なうことになるが,php内からももちろん作成が可能である。以下のAPIがwp-includes/taxonomy.phpに用意されているので,これを使用すればよいだろう。
1 2 3 |
wp_insert_term($cat_name, 'category', array('slug' => $slug, 'parent' => $parent, 'description' => $description)); |
なお,admin内であれば以下のショートカットAPIを使うとよりシンプルかと思われる。このAPIは,wp-admin/includes/taxonomy.phpで定義されている。
1 |
wp_create_category($cat_name, $parent = 0); |
でここから,階層構造をもつカテゴリーを一度に複数指定したい場合。
これには,ちょっとはまってしまった。まず,カテゴリー作成が行なわれた場合,term関連のテーブルが更新され,clear_term_cache関数により各種wpキャッシュが削除され,さらにcategory_childrenという子カテゴリーのリストを保存するデータがwp_optionsテーブルから削除される。しかし,clear_term_cache関数では,static指定でtaxonomy(ここでは,category)のキャッシュをクリアしたどうかのフラグが管理されており,category_childrenの削除は最初の一度しか有効にならない。よって,階層構造をもつカテゴリーを一度に複数作成した場合,最初に作成した時のみcategory_childrenが削除され,残りの作成したカテゴリーに適用されない。category_childrenオプションは,管理画面のカテゴリー画面で使用されている値のため,結局表示されるカテゴリーリストとテーブルデータとの間に差異が生じ,カテゴリー階層が正しく表示されないことになる。
結局,以下のようにキャッシュを強制的に削除することで対応した。
1 2 3 4 5 6 |
// clean_term_cache関数より引用 $texonomy = 'category'; wp_cache_delete('all_ids', $taxonomy); wp_cache_delete('get', $taxonomy); delete_option("{$taxonomy}_children"); _get_term_hierarchy($taxonomy); |
このやり方は正攻法でないかもしれないし,そもそも一度に階層構造をもつカテゴリー指定を行なうこと自体が推奨されないのかもしれない。
コメント