あるページテンプレートを使用している固定ページを保存した時に、その固定ページで使用しているキャッシュを消すなどの処理をしたい時とか。
投稿(post)も・固定ページ(page)も保存時は save_post
アクションフックが呼び出される。
save_post
インポート機能の利用、投稿・ページ編集フォームの利用、XMLRPCでの投稿、メールでの投稿のうちいずれかの方法で投稿・ページが作成・更新された際に実行する。実行されるタイミングはデータがデータベースに保存された後。
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・)
[参考]
- Plugin API/Action Reference/save post « WordPress Codex
- save post - Check for page template on save_post hook - WordPress Development Stack Exchange

- 作者: 阿部洋一
- 出版社/メーカー: 集英社
- 発売日: 2015/03/19
- メディア: コミック
- この商品を含むブログ (2件) を見る