この記事では「管理画面で投稿やカスタム投稿の公開ステータスを更新したときに何かしらの処理をする」方法の備忘録です。
functions.php を修正します。重要なファイルなので、試す場合はバックアップを忘れずに。
きっかけ
- 全ページ共通のエリア、ナビゲーション。ナビゲーションの内容が、カテゴリーごとに最新10件表示する場合。これをベージ遷移するたびに生成するのは処理負荷がかかっているように感じた
- そこで、ナビゲーションだけのファイルを別に用意して、1日キャッシュするようにして、1日ごとにナビゲーションを更新するようにした
- ただ、タイミングが悪いと丸2日近くナビゲーションが更新されないことが発生してしまうので、キャッシュはやめて毎時12時にナビゲーションのファイルを更新するようにした
- ただ、これだと記事を更新したタイミングではナビゲーションが更新されないので、直接ナビゲーションのファイルを呼び出した場合は、即時更新するようにした
- どうせなら、投稿を公開したタイミングで、自動でナビゲーションファイルをアクセスすればいいのでは?ということで実装方法を調べてみる
- 公開を非公開にした場合もナビゲーションファイルの更新が必要なので要件に追加する
それでは、早速これらの経緯を踏まえて実装してみる。
transition_post_status
functions.php に追加(追加場所はどこでも)
/**
* 記事が公開、もしくは非公開にステータスが変更された場合に処理をする
*/
function when_post_publish_or_not($new_status, $old_status, $post) {
// ステータスが公開以外から公開に変わった場合、もしくは公開から公開以外に変わったか判別する
if (($new_status === "publish" && $old_status !== "publish") ||
($new_status !== "publish" && $old_status === "publish")) {
// ファイルにアクセスする
$load_nav_file = file_get_contents("{ファイルのURL}");
if (!$load_nav_file) {
// アクセスに失敗した場合はメール通知する
wp_mail("{メールアドレス}", "メールタイトル", "メール本文");
}
}
}
add_action('transition_post_status', 'when_post_publish_or_not', 10, 3);
- 関数名とadd_actionの第2引数の値「when_post_publish_or_not」は同じである必要があるが、命名は任意
- {ファイルのURL}には、httpsから始まるURLを記述する
- アクセスに失敗した場合にメール通知するように、{メールアドレス}には、自分のメアドを記述する
以上で、if文やif文の中身をカスタマイズすることで、「投稿やカスタム投稿の公開ステータスを変更したときに何かしらの処理をする」ことができる。
少し補足しておく。
投稿ステータス
$new_status、$old_status は、基本下記のいずれかの投稿ステータスの情報を持っている(カスタム投稿ステータスというのもあるらしいが詳細不明)。
これらを組み合わせることで、投稿ステータスがどのような状態か判別できる。
new | (新規) | 以前のステータスが存在しない状態 |
---|---|---|
publish | 公開済 | |
pending | 承認待ち | |
draft | 下書き | |
auto-draft | 自動保存 | 作成されたばかりの投稿で、コンテンツがない |
future | 予約済 | 未来に公開を予定されている投稿 |
private | 非公開 | ログインしていないユーザーには表示されない |
inherit | 継承 | リビジョンまたは添付ファイル |
trash | ゴミ箱 |
カスタム投稿を使う場合
第3引数の$postを使って、投稿タイプを取得できる。
$post -> post_type
$post -> post_type で、投稿の場合は、”post”、カスタム投稿の場合は、任意に設定した投稿タイプスラッグを取得できる。