管理画面にページを追加
Contents
add_posts_page()
管理画面のメニューのどこかに項目を追加して新たにページを表示させるのは、テーマとかプラグインでは既にやっていることで、どれも基本的には同じこと。ただ、項目を追加する場所によって、使う関数が違ってくるだけのこと。
今回は投稿メニューの中に項目を追加するので、使うのは add_posts_page()。
テーマメニューなら、add_theme_page()。プラグインメニューならば add_plugins_page() と。当然のこと、他にもそれぞれのメニュー用に用意されてる。
その書式はというと、アクションフック admin_menu によって指定する関数を登録する。
3つ目の $capability に関しては codex の説明を見たほうが良いと思われる。
4つ目の $menu_slug はこのページを表示する時の slug として使用されるので重要。
そして 5つ目の $function は実際に表示するこのページの内容のコードとなる関数を指定する。
さて、今回は何のページを追加するかというと。
長いこと使ってきた WordPress Editorial Calendar というプラグインの代わりとなるページ。投稿をその投稿した日時によりカレンダーに表示してくれて、なおかつ、その場で投稿する日付や時間を変更でき、日付の変更はドラッグでも出来るというすぐれもの。
ただ、日付や時間の変更ということでは、あまり使ったことはなく、予約投稿をするのにどこまで投稿のある日付がうまっているかなどの確認に重宝してた。そう、逆にいえば、ただそれだけのことで使うのであれば、プラグインでなくてもいいし、できれば祝祭日も表示されていたほうがありがたかったのである。
と、いうことで、ただの投稿カレンダーなら簡単に自作できるし、プラグインを一つ減らす事ができるというメリットもついてくるってわけ。
で、できたものはこんなかんじ。
投稿カレンダーは、すでに自作しているプラグインのものからの流用。やっていることはほぼ同じ。
ただ、こっちは今月を含め、前後の三ヶ月分の表示にしてる。実際に使っていて見るのはそのぐらいだったというか、前月もいらなかったのかもしれない。
休日データもプラグインのものと全く同じものを併用してる(自サイトの場合は、プラグインという形ではなく、functions.php に内蔵しているので同じデータを呼び出して使ってる)。
私的にカレンダーを描写する理屈としては、とある月のカレンダーを作成するのに必要なデータは、その月の日数とその月の1日が何曜日であるかということ。grid で日付の表を作れば、その初日の曜日分、grid-column-start を指定してやれば、その分初日が offset される。その月が何年何月何日というのは、ただ表示用として必要なだけ。
まずは、その2つのデータから三ヶ月分の日付を key として配列をつくる。
初日の曜日からその月の日曜日と土曜日が何日かも取得出来る。
SQL で投稿の情報を取得。
で、休日データとその日曜、土曜データ、投稿の情報を三ヶ月分の日付配列へと反映させて、最後にその配列をループさせて HTML を組み立てる、といったあんばい。
とにかく条件式を極力少なくするということを前提にした結果がこうなったということです。
と、いうことでまずはその初日の曜日からその月の指定した曜日の日付を得る関数と休日データを返す関数。
そして、add_posts_page() で指定したメインとなる関数。
現在日時を取得するのに WordPress においては 9時間のずれが生じるので、以前は自前の関数を使っていたのだけれど、その部分を DateTimeImmutable クラスを使う手法に直してる。シンプルで解りよいし、なにかと安心して使えると思う。
get_current_screen()
で、あとはこのページのスタイル設定など。
管理画面にスタイルを吐き出すのには、アクションフックの admin_print_styles を使えばいい。
なんだけれど、必要なそのページだけに排出させたいときはどうすれば良いのか、ってこと。
ちょっと調べてみると、この get_current_screen() というのが使えそう。
これは現在の画面のオブジェクト、というかいろんな情報を返してくれるとのことで。この中の要素の base において、add_posts_page() で指定したページの slug として使用されている $menu_slug の値が入っているので、それにて判別すれば良さそう、ということにした。
ちなみに、functions.php において、このような管理画面だけで必要なコードの類は別ファイルにまとめ、 is_admin() を使って include_once するようにしてる。ただし、アクションフックの publish_post などに関わる関数は、管理画面にアクセスしているときだけに動くものではないので要注意。管理画面だけで必要なコードの量は、自分の場合、全体の 34% ほどあった。ページの表示の高速化は小さなことの積み重ねだと。
以上。
Post : 2021/08/19 11:50
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=167455