「Category Limitation」プラグインのバージョンアップが出来ました。
自分達で使うのみだったのでかなり強引に実現させていたのですが、予想外に需要があったので「早いうちに何とかしないといけないなぁ」と思い続けて2年ぐらい経っていました。
旧バージョンでは一度編集画面のhtmlを全て取得した上で、カテゴリーの箇所だけ書き換えるという方式でした。かなり無理やりな手法だったので、この度のバージョンアップではなるべくWordPressのルールに従った方法で実現しています。
実現する為のアプローチとプラグインで実行している作業を時系列に列挙しておきますので、もし「こうした方が良いよ」というのがあれば教えてください。
まず、フィルターフックを利用してカテゴリーに制限をかけたいと思い、WordPressのコアファイルをズンズン掘り下げていき、利用できそうな関数を探しました。が、そんな都合よくピッタリのものがありませんでした。
何か一つでもあればと探していると「get_terms」関数を見つけて、これがフィルターフックで利用できるという事を知りましたので、ここでカテゴリーの制限をかける事にしました。
制限をかけるといっても記事編集とクイック編集のカテゴリー欄だけに限定しないといけないので、PHPの関数「 debug_backtrace() 」を利用する事にします。
debug_backtrace() で呼び出し元の関数が調べられるので、記事編集とクイック投稿で利用されている呼び出し元の関数を調べると「wp_terms_checklist」と「post_categories_meta_box」の二つが特別そうでしたが、「post_categories_meta_box」は記事編集画面のみだったので「wp_terms_checklist」で判定する事にしました。
これで「get_terms」関数にフィルターフックをかけて、呼び出し元に「wp_terms_checklist」関数が含まれる場合はカテゴリー制限を掛けてデータを返す、という一連の処理が出来ました。
不安なのは「wp_terms_checklist」が他の処理に影響が場合ですが、今のところ無いので恐らく大丈夫、かな?
(「/wp-admin/admin-ajax.php」と「/wp-admin/press-this.php」、「/wp-admin/includes/class-wp-posts-list-table.php」で使われてはいるんですけど…。)
あと、ここを参考にしてカテゴリーの階層表示をキープする処理を追加しておきました。
書くと簡単なのですが、結局丸二日ぐらい掛かってしまいました。
その分、前バージョンと比べると良くなったと思います。
また、設定画面で練習を兼ねてcss3を利用しています。利用しているブラウザによってスクリーンショットが違う場合もありますがご容赦ください。