この記事は最後に更新してから1年以上経過しています。

リクエスト応答を終了する前に何かを処理する

説明

PHPでは、register_shutdown_function関数を使うことでリクエストに対してレスポンスを返した後に何らかの処理を行うことができる。WordPressでもregister_shutdown_function関数は使えると思うのだが、テーマ内のテンプレートでページを表示した後で何かを行う場合はどうすればいいのか、ちょっと調べてみた。

まずWordPressでregister_shutdown_function関数を使っているかを調べてみた。最新(3.6.1現在)のソースコードを眺めると、キャッシュ管理を行うWP_Object_Cacheクラス、データベースアクセス管理を行うwpdbクラス、wp-settings.phpの中でregister_shutdown_function関数を呼び出していることがわかった。

ここで注目したのは、wp-settings.phpの中の呼び出しで、shutdown_action_hookというプライベート関数を登録していた。このshutdown_action_hook関数ではshutdownアクションを実行しており、プラグインや自テーマのfunctions.phpなどで直接register_shutdown_function関数を呼び出すよりも、 add_action関数でshutdownアクション関数を登録するほうがWordPressの行儀にあっているだろう。

add_action( 'shutdown', 'my_shutdown' );
function my_shutdown() {
	// ここに処理内容を記述
}

今回調べたきっかけは、ファイルキャッシュ系のプラグインを作るためだった。実際のところ、リクエスト応答の流れをトレースしてみると、PHPのob_start関数を呼び出してバッファを開始した場合、shutdownアクションが実行される前にob_start関数でバッファされた内容はフラッシュ(出力)されていた。結論として、shutdownアクションの前にバッファされた内容を取得して必要な処理を行わなければならず、最終的にはob_start関数のコールバック関数を指定することで目的は実現できた。

このように羽陽曲折があったわけだが、いつか使う時が来ることを期待してshutdownアクションについてメモっとく。


最終更新 : 2013年09月26日 11:22


お勧め

get_the_post_thumbnail_caption(2018年5月27日 更新)

string get_the_post_thumbnail_caption( mixed $post = null )
投稿ページのサムネイル(アイキャッチ画像)キャプションを取得する。

wp_enqueue_style(2019年11月25日 更新)

void wp_enqueue_style( string $handle [ , string $src = false [ , array $deps = array() [ , string $ver = false [ , string $media = 'all' ] ] ] ] )
使用するスタイルシート(CSS)を出力用のキューに入れる。パラメータ$srcが指定された場合は、グローバル変数$wp_stylesに登録してから出力用のキューに入れる。

post_class(2018年5月27日 更新)

void post_class( [ string $class = '' [ , int $post_id = null ] ] )
投稿情報の種別に応じたクラス属性(class="post-?? post ...")を表示する。具体的なクラス名は、投稿ID(post-番号)、投稿種別(postやpage)、カテゴリー(category-名前)、タグ(tag-名前)などがある。これらクラス名に合わせたCSSを準備することで、投稿ページのユニークなデザインが表現可能になる。

get_header(2020年8月18日 更新)

void | false get_header( [ string $name = null [ , array $args = array() ] ] )
ヘッダパーツを記述したメインヘッダファイルheader.php(またはサブヘッダファイルheader-???.php)を読み込む。

get_the_excerpt(2018年5月27日 更新)

string get_the_excerpt( [ mixed $post = null$deprecated = '' ] )
投稿情報の抜粋記事を取得する。