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

カスタム投稿タイプの投稿保存には専用アクションを使おう

説明

カスタム投稿タイプを登録して、専用ウィジェット(meta_box)を使って拡張情報を入力させ、それらの情報をsave_postアクションで保存する。これまではこんな感じだったのだが、久しぶりにカスタム投稿タイプを使ったら、save_postアクションの前にsave_postに投稿タイプ名がくっついたアクションが追加されていた。

あらゆる投稿情報の保存は、 wp_insert_post関数で行われる。これはカスタム投稿タイプであっても例外ではなく、その中のアクションを利用することで独自に拡張した情報を保存することができる。それに対応できるアクションはいくつかあり、従来はsave_postアクションを利用することが多かったと思う。

do_action( 'save_post', $post_ID, $post, $update );

上記は3.9.1のコードになるが、よく見ると$updateパラメータが追加されており、アクション関数内で新規か更新かを判別できるようになっている。過去のバージョンのソースコードを見てみると、この変更は3.7.0からのようだ。そしてこのsave_postアクションの直前には、次のようなsave_postに投稿タイプ名が付いたアクションが記述されていた。

do_action( "save_post_{$post->post_type}", $post_ID, $post, $update );

アクション名が投稿タイプ別になることから、このアクションを使用すればアクション関数内で投稿タイプの判定をする必要はなり、コードはすっきりするだろう。具体的な使い方だが、例えばカスタム投稿タイプ名が'tool'なら、次のように記述すればいい。

add_action( 'admin_init' , 'my_admin_init' );

function my_admin_init() {
	add_action( 'save_post_tool', 'my_save_post_tool', 10, 3 );
}

function my_save_post_tool( $post_ID, $post, $update ) {
	// カスタム投稿タイプ専用の入力項目名が"tool[○○○○]"の場合
	if ( isset( $_POST['tool'] ) ) {
		$tool_params = stripslashes_deep( $_POST['tool'] );
		// 以下に保存用の処理を記述

	}
}

このような記述は3.7.0より前のバージョンでは無効なので、汎用のテーマやプラグインで使用する場合はバージョン制限を意識する必要がある。また、このアクションは wp_publish_post関数でも呼び出されるので、フォーム(ウィジェット)から送信されるデータの有無も注意しよう。


最終更新 : 2014年07月04日 17:23


お勧め

previous_post_link(2018年5月27日 更新)

void previous_post_link( [ string $format = '« %link' [ , string $link = '%title' [ , bool $in_same_cat$in_same_term = false [ , mixed $excluded_categories$excluded_terms = '' [ , string $taxonomy = 'category' ] ] ] ] ] )
1つ前の投稿ページのリンクを表示する。

is_day(2018年5月27日 更新)

bool is_day( )
要求されているページが、日別アーカイブページ(リクエストURLが/2009/11/30のように、書式が「/年/月/日」の場合)か調べる。

get_previous_posts_link(2014年12月24日 更新)

string get_previous_posts_link( [ string $label = null ] )
前ページ(アーカイブ)へのリンクテキストを取得する。

get_post_custom_values(2013年10月7日 更新)

array get_post_custom_values( [ string $key = '' [ , int $post_id = 0 ] ] )
カスタムフィールドの値を取得する。

add_dashboard_page(2014年12月26日 更新)

mixed add_dashboard_page( string $page_title, string $menu_title, mixed string $capability, string $menu_slug [ , mixed $function = '' ] )
ダッシュボードメニューにサブメニューを登録する。