Category Limitation バージョンアップ

Category Limitationのバージョンアップを行いました。

制限チェックを入れたカテゴリーが複数ある場合、デフォルトのカテゴリーを設定しておく事が出来ます。一つだけチェックを入れている場合は常にそれがデフォルトになります。

恐らく現状これで管理は完璧だと思っております。是非ご活用下さい。

もしまともに動かない場合、「こうした方が良い」というアイデアがありましたらお知らせ下さい。

Category Limitation バージョンアップしました

WordPress用カテゴリー制限プラグイン「Category Limitation」をバージョンアップしました。

新規投稿時(または記事編集時)にカテゴリーのチェックを入れ忘れた場合、制限されているカテゴリーがデフォルトになるようになりました。

実はこの機能、公開当初より実装していたのですが上手く機能していないので「ま、いっか」と放置していた部分。頂いたコメントからやはり大事な部分だと気持ちを改めてソースを見直しましたところ、一箇所大事なところが抜けている事を発見しました。

もう少しちゃんと見直せば直ぐに分かった部分なのですが、今までずっと無視していたので反省。これまでダウンロードして頂いた方にもご迷惑を掛けてしまったなぁ。というより、不完全な状態で公開した自分に腹も立ちつつ…。

という事で、前バージョンよりもより完璧に近づいた「Category Limitation」をご利用下さい。

なお現バージョンですが、複数のカテゴリーを設定されていた場合、取得したカテゴリーの一番最初のカテゴリーがデフォルトになってしまいます。

来週にはデフォルトのカテゴリーを設定できるバージョンをリリース予定ですので、楽しみにお待ち下さい。

「Category Limitation」バージョンアップしました

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を利用しています。利用しているブラウザによってスクリーンショットが違う場合もありますがご容赦ください。