かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress 特定の固定ページを保存時に処理を実行したい。

あるページテンプレートを使用している固定ページを保存した時に、その固定ページで使用しているキャッシュを消すなどの処理をしたい時とか。

投稿(post)も・固定ページ(page)も保存時は save_post アクションフックが呼び出される。

save_post
インポート機能の利用、投稿・ページ編集フォームの利用、XMLRPCでの投稿、メールでの投稿のうちいずれかの方法で投稿・ページが作成・更新された際に実行する。実行されるタイミングはデータがデータベースに保存された後。

プラグイン API/アクションフック一覧

save_postのアクションフックで呼び出される関数の第二引数で保存された投稿・ページのオブジェクトを得ることができるようです。これを利用して、投稿(post)なのか固定ページ(page)なのかを判別します。
refs. Plugin API/Action Reference/save post « WordPress Codex

次に固定ページで使われているテンプレートですが、これは $_REQUEST['page_template'] で取得することができるようです。
get_page_template_slug( $post_id ); でも固定ページのテンプレートファイル名を取得することができますが、関数を呼び出さないだけ、$_REQUESTから取得する方が早そうな気がします。
$_REQUEST['page_template'] でも get_page_template_slug( $post_id ); でもテンプレートファイルがディレクトリの中にある場合は、ディレクトリ名を含めて取得されるので注意が必要です。
refs. save post - Check for page template on save_post hook - WordPress Development Stack Exchange

後は、アクション内で投稿タイプと固定ページのテンプレートファイル名で判定してあげればOKです。

<?php // function.php
// post・page保存時に実行するアクションフックを作成
add_action('save_post', 'my_save_post', 10, 3);

/**
 * @param $post_id: 保存された投稿のID
 * @param $post: 保存された投稿のオブジェクト
 */
function my_save_post( $post_id, $post ) {
  // 投稿タイプを取得
  $post_type = $post->post_type;
  
  // 固定ページの時
  if( $post_type === 'page' ) {
    // ページテンプレートを取得
    $page_template = $_REQUEST['page_template'];

    // page-templates/my-page.php テンプレートを使っている固定ページの時
    if( $page_template === 'page-templates/my-page.php' ) {
      /* 特定の固定ページのキャッシュを削除するとかの処理 */
    }
  }
}

これで、うまく動作させることが出来ました!

save_postのアクションフックはてっきり投稿(post)だけで、固定ページはsave_pageとかあるんじゃないかと表いたのですが、まさか同じsave_postだったとは...知りませんでした。
今までpost_typeとかで判定させてなかったので、投稿でも・個別ページでもガンガン処理されちゃってた訳ですね。(まぁキャッシュを消すとかの処理しかしてなかったのでセフセフ... )

それにしてもアクションフックとかアクションフィルターとかタクソノミーとかWordPressでよく出てくる単語の挙動とか何を指すのかとか正しく把握できてないのが問題ナンダナ (・x・)


[参考]

オニクジョ (ヤングジャンプコミックス)

オニクジョ (ヤングジャンプコミックス)