【WordPress】ダッシュボードで期限管理をしてみる

大体の書類には内容を保証する「有効期限」があります。

・・・小難しく書きましたが、期限が切れないように管理するものです。

少し前に書類自体が目的に応じてPCやらサーバーやら色んなところに保管されていたので。

保管場所はそのままでも期限管理は一箇所で行いたいなと思ったのです。

色々方法を考えた結果、毎日一度は見るワードプレスのダッシュボードで管理してみることに。

ダッシュボードにウィジェットを追加する

ダッシュボードには初期状態で編集やブログの管理に関わるウィジェットが配置されています。

そこに期限管理用のウィジェットを追加し、その中で表示・実行される内容を作っていくという流れです。

ダッシュボードにウィジェットを追加するには、wp_add_dashboard_widget()を使用します。

function add_documents_widgets(){
    wp_add_dashboard_widget(
        'documents_widget',
        '書類期限管理',
        'documents_widget_function'
    );
}
add_action( 'wp_dashboard_setup', 'add_documents_widgets' );

wp_add_dashboard_widget()は引数で細かく設定できますが、今回は期限切れの書類を表示させるだけのシンプルなものを想定しているので、上記のコードをfunctions.phpに入力します。

使用しているのは第一引数でウィジェットのIDを’documents_widget’指定し、第ニ引数でウィジェットのタイトルが’書類期限管理’と表示されるようにしています。

第三引数はこのウィジェット内で実行される関数名を指定しておきます。

これをアクションフック’wp_dashboard_setup’で実行すれば、まずは入れ物となるウィジェットが作成されます。

書類の期限管理を行う関数の中身を作成する

ちょっと前置きをすっ飛ばした気がするので、簡単にまずは書いておくと。

書類を利用する人を投稿で作成し、その中に管理したい書類名(例えば運転免許証など)がラベルとなっているカスタムフィールドを用意しているとします。

カスタムフィールドの作成は、Advanced Custom Fieldsを利用しているものとして以下コードを書いて行きます。

さて、ダッシュボード内で実行したいことを簡単にまとめておくと。

・カスタムフィールド内に入力されている日付を過ぎたらアラート表示
・アラートに編集画面へのリンクをつけて対応後に日付更新

ということです。

これを先程コールバック関数として指定した、’documents_widget_function’に設定していきます。

編集画面へのリンクはedit_post_link()

前後しますが、まずは作成したウィジェットに編集画面へのリンクを表示させる方法です。

今回はあくまでダッシュボード、つまり管理画面での使用を想定しているので、アラートが表示されたら直接編集画面に行けると便利。

なので、アラート表示に使う文字列にedit_post_link()を利用します。

edit_post_link( '表示されるリンク文字列', 'リンク文字列の前に置くもの', 'リンク文字列の後ろに置くもの', 編集したい投稿のID );

この4つの引数を指定することで、編集画面への文字リンクを作成できます。

第四引数でIDの指定が必要なので、実際にはループと組み合わせ、複数投稿(先程の例で言えば、運転免許証の有効期限を管理しておきたい人数)に対応できるようにします。

本題の期限管理はDateTime()で

編集画面へのリンクは常に表示させるのではなく、期限が切れたら表示させたいので。

日付比較による条件分岐をDateTime()で作ります。

で、自分以外が入力することになっても迷わないように、書類に書いてある日付で動作するようにしていきたいなと。

書類に書いてある日付はざっくりと「有効期限」と「発行日」として、それぞれのパターンを考えてみます。

有効期限のある書類

有効期限が書いてあるものは、単純に「今日」との比較で良いでしょう。

有効期限が今日より古ければ、アラートが表示されるようにします。

//ループ内に記述しているものとします。
//タイムゾーンを取得
    date_default_timezone_set( 'Asia/Tokyo' );
    //現在年月日を取得
    $now_date = new DateTime();
    //投稿のID取得
        $doc_post_id = $documentList->post->ID;
        //カスタムフィールドに入力されている書類の有効期限を取得する
        $License = new DateTime( get_field( 'Driver-License', $doc_post_id ) );
        //表示する内容
        if( !empty( $License ) && $License <= $now_date ){
            echo the_title();
            edit_post_link( "〇運転免許証", "<p>", "</p>", $doc_post_id );
        }

new DateTime()で現在日時を取得。

投稿のカスタムフィールドの値をDateTime()で呼び出して取得。

現在の日付>書類の期限となったら、投稿のタイトルと編集画面への文字リンク「◯運転免許証」を表示させます。

入力された日付との比較はこれでOKです。

有効期限が書いてない書類

有効期限が書いてない書類は、作成日からの有効期限が決められている書類ということです。

2023年10月3日に作成され、有効期限が1年間とされている場合、2024年10月3日が期限の切れる日となります。

1年とかであれば、入力者に計算させても問題ないかもしれませんが。

管理する書類が増え、それぞれでこの期限が違うと覚えなければなりません。

大変ですし面倒です。しかも、入力ミスも増えそうですね。

なので作成日から計算して期限を割り出し、現在日時と比較します。

//ループ内に記述しているものとします。
//タイムゾーンを取得
    date_default_timezone_set( 'Asia/Tokyo' );
    //現在年月日を取得
    $now_date = new DateTime();
    //投稿のID取得
        $doc_post_id = $documentList->post->ID;
        //カスタムフィールドに入力されている書類の作成日を取得する
        $other_docs = new DateTime( get_field( 'other-document', $doc_post_id ) );
               //取得した日付を1年後にする
        $other_docs->modify('+1 year');
        //表示する内容
        if( !empty( $other_docs ) && $other_docs <= $now_date ){
            echo the_title();
            edit_post_link( "なにかの書類", "<p>", "</p>", $doc_post_id );
        }

DateTime()に用意されているmodify()メソッドを使うことで、取得した日付を変更することができます。

また、一年後なら’+1 year’のように相対日付も使えるのもわかりやすくて良いです。

ただし、modify()を利用すると取得した日付自体が変わってしまいます。

上記のコードの場合、カスタムフィールドに入力されていた日付が2023年10月3日だとすると、$other_docsに格納されている日付はmodify( '+1 year’)により2024年10月3日に上書きされます。

これは個人的な体感もありますが、DateTime()で取得した日付を変更する場合、cloneを利用して新しい日付を用意する方が誤作動が少ない気もします。

//例えば
                $Work_doc = new DateTime( get_field( 'Work_doc', $docs_post_id ) );
                $Work_doc_clone = clone $Work_doc;
                $Work_doc_deadLine = $Work_doc_clone->modify( '+6month' );

コードを書いている間に、元々カスタムフィールドに入力されていた値を条件判定で使わなければいけなくなったことがありましたし。

使う可能性があればcloneしておくのも良いかと。

このように、ウィジェット内で表示する内容を関数で設定します。

実際に書類の種類で分けたりしてたら、コードが長くなってしまったので。

ぶつ切りの一部ですが載せてみました。

実際にwp_add_dashboard_widget()に指定した関数は、関数を実行する関数にしてエディタの目次のように利用してます。

日付比較は奥深い

と、ダッシュボードにウィジェットを追加するには?ということで書いて来ましたが。

実際にはDateTime()の扱いに四苦八苦したので、その備忘録として書いてみた感じです。

扱いなれればすごく便利そうですが、それまでが大変そうですね。

頑張ります。

参考:WordPress 管理画面カスタマイズまとめ‐Qiita
参考:PHPのDateTimeクラスで日時を扱う‐PHP JUNKIE
参考:PHP: DateTimeオブジェクトのコピー‐エラーの向こうへ