
投稿した記事を一定の期間が過ぎたら自動的にゴミ箱に移す
wp_schedule_single_eventでスケジュールを登録する
個人のブログではほとんど必要ないと思いますが、投稿した記事に公開期限を決めて、公開期限が過ぎたら自動的に記事を読めなくする(ゴミ箱に移す)といった場合の処理を実装します。
Wordpressにはスケジュールを決めて自動的に処理を実行するための関数「wp_schedule_single_event」があります。
ゴミ箱に移すアクションを登録
まず記事をゴミ箱に移すというアクションを登録しておきます。
お使いのテーマディレクトリ内のfunctions.phpに下記を記述します。
なんてことはないです、引数でゴミ箱に移す記事のIDを指定しておいて、その記事を「wp_trash_post」でゴミ箱に移す。ただそれだけです。
アクション名は「schedule_post_expire」としておきました。
記事保存時にスケジュール登録
次に記事を保存するときのアクション「save_post」に対してフックして、先ほど登録したゴミ箱に移すアクションをスケジュールに登録します。
もし複数のカスタム投稿タイプがあり、特定の投稿タイプにだけ処理を行ないたい場合はアクション名を「save_post_[カスタム投稿名]」とすれば、そのカスタム投稿のみの処理となります。
同じくfunctions.phpに下記を追記します。
「save_post」のアクションフックには以下のパラメータが渡されます。
- $post_ID…保存した記事のID
- $post…保存した記事の投稿データ
- $update…既存投稿の更新ならtrue、新規投稿ならfalse
まず最初に記事のIDがリビジョン(自動保存)かどうかを「wp_is_post_revision」で確認し、リビジョンであれば本来の記事IDを返します。
次に「wp_next_scheduled」でこれから登録しようとしているアクションのスケジュールが既に登録されているかどうかチェックをして、既に登録されている場合は「wp_clear_schedule_hook」一旦削除します。
最後に「get_post_time」で投稿した記事の日付(必ずUNIX タイムスタンプ型である必要があります)を取得し、そこから2週間分を追加した日付を取得しておきます。
そして「wp_schedule_single_event」で第一引数の実行日に先ほどの日付を、第二引数に実行するアクション名「schedule_post_expire」を、第三引数に記事のIDを渡して完成です。
実行タイミング
これで記事を公開した2週間後には自動的にその記事はゴミ箱に移ることになるのですが、これcronのような自動処理に見えて実は本当の自動処理ではなくて、スケジュール日以降に最初にユーザーがアクセスした際に実行されているだけらしいです。なのでユーザーがサイトにアクセスしない限りスケジュール日を過ぎてもゴミ箱に移ってないわけですね。