• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

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

提供: WordPress Codex 日本語版
移動先: 案内検索

この項目「プラグイン API/アクションフック一覧/save post」は、翻訳チェック待ちの項目です。加筆、訂正などを通して、Codex ドキュメンテーションにご協力下さい。

説明

save_post は投稿や固定ページが作成または更新されたとき実行されるアクションです。インポート、投稿や固定ページの編集画面、XMLRPC、メールによる投稿などがきっかけになります。投稿データは投稿の編集方法に応じて $_POST, $_GET またはグローバルの $post_data に保存されます。例えばクイック編集は $_POST を使います。

このアクションは投稿が保存された直後に実行されるので、get_post( $post_id ) を使ってその投稿オブジェクトを簡単にアクセスできます。

訳注: 2番目の引数(WP_Post オブジェクト)を利用して get_post() を使わずに投稿データを参照できます。

使い方

投稿 ID のみを使う場合:

<?php add_action( 'save_post', 'function_name' ); ?>

3つのパラメータを使う場合(13はアクションを実行する優先度の例です):

<?php add_action( 'save_post', 'function_name', 13, 3 ); ?>

パラメータ

フックされたアクション関数には以下のパラメータが渡されます。

$post_ID
整数) (必須) 投稿 ID。
初期値: なし
$post
WP_Post オブジェクト) (必須) 投稿データ。
初期値: なし
$update
真偽値) (必須) 既存投稿の更新なら true, 新規投稿なら false。
初期値: なし

用例

基本的な例

ウェブサイトの投稿や固定ページが更新されるたびにメールを送信します。

function my_project_updated_send_email( $post_ID ) {

	// リビジョンならメールを送らない。
	if ( wp_is_post_revision( $post_ID ) )
		return;

	$post_title = get_the_title( $post_ID );
	$post_url = get_permalink( $post_ID );
	$subject = '投稿が更新されました';

	$message = "サイトで投稿が更新されました:\n\n";
	$message .= $post_title . ": " . $post_url;

	// 管理者へメールを送る。
	wp_mail( 'admin@example.com', $subject, $message );
}
add_action( 'save_post', 'my_project_updated_send_email' );

カスタム投稿タイプ: 'book'

'book' (本) というカスタム投稿タイプがあり、著者、出版社、出版中かどうか (in print) を書くとします。次の例は、これらの情報をメタデータに保存します:

/**
 * 投稿が保存されたとき投稿メタデータも保存する。
 *
 * @param int  $post_ID  投稿 ID。
 * @param post $post     投稿オブジェクト。
 * @param bool $update   既存投稿の更新か否か。
 */
function save_book_meta( $post_ID, $post, $update ) {

    /*
     * 本番環境のコードでは、スラッグはプラグイン内で一度だけセットすべきです。
     * クラスのプロパティが良いでしょう。必要とする関数ごとにスラッグを書くのではなく。
     */
    $post_type = get_post_type( $post_ID );

    // 'book' の投稿でなければ、更新しない。
    if ( "book" != $post_type )
        return;

    // 投稿メタデータを更新する。

    if ( isset( $_POST['book_author'] ) ) {	// 著者
        update_post_meta( $post_ID, 'book_author', sanitize_text_field( $_POST['book_author'] ) );
    }

    if ( isset( $_POST['publisher'] ) ) {	// 出版社
        update_post_meta( $post_ID, 'publisher', sanitize_text_field( $_POST['publisher'] ) );
    }

    // チェックされていたらデータがあり、されていなければデータはない。
    if ( isset( $_POST['inprint'] ) ) {	// 出版中かどうか
        update_post_meta( $post_ID, 'inprint', TRUE );
    } else {
        update_post_meta( $post_ID, 'inprint', FALSE );
    }
}
add_action( 'save_post', 'save_book_meta', 10, 3 );

quick_edit_custom_box: 入力の作成 も見てください。

参考: WP 3.7 において別のアクションが導入されました。特定の投稿タイプについて呼び出される save_post_{post_type} です。そのため、このアクションにフックした関数では投稿タイプをチェックしなくても構いません(上の例で if ( "book" != get_post_type( $post_ID ) ) の部分)。

無限ループ回避

wp_update_post() のようにフック save_post を含む関数を呼び出すと、フックした関数が無限ループを引き起こします。これを避けるには、必要な関数を呼ぶ前に自分(関数)をフック解除し、終わってから改めてフックします。

<?php
// この関数はデフォルトのカテゴリーが付いたすべての投稿を非公開(private)にします。

function set_private_categories($post_id) {
	// リビジョンなら本物の投稿の ID を取得
	if ( $parent_id = wp_is_post_revision( $post_id ) ) 
		$post_id = $parent_id;

	// オプションからデフォルトのカテゴリーの ID を取得
	$defaultcat = get_option( 'default_category' );

	// 投稿がデフォルトのカテゴリーであるか確かめる
	if ( in_category( $defaultcat, $post_id ) ) {
		// 自分をフック解除して無限ループさせない
		remove_action( 'save_post', 'set_private_categories' );

		// 投稿を更新するので save_post がもう一度呼ばれる
		wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );

		// 自分を改めてフックする
		add_action( 'save_post', 'set_private_categories' );
	}
}
add_action( 'save_post', 'set_private_categories' );
?>

参考: remove_action()add_action() に同じパラメータを与えることがとても重要です。優先順を指定する例(抜粋)を見てください... パラメータが違うと、無限ループが起きます... :-(

		// 自分をフック解除して無限ループさせない
		remove_action( 'save_post', 'set_private_categories', 13, 2 );

		// 投稿を更新するので save_post がもう一度呼ばれる
		wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );

		// 自分を改めてフックする
		add_action( 'save_post', 'set_private_categories', 13, 2 );
	}
}
add_action( 'save_post', 'set_private_categories', 13, 2 );

変更履歴

ソースファイル

wp-includes/post.php にある wp_insert_post() および wp_publish_post() によりトリガーされます。

関連項目

アクション

フィルター

最新英語版: WordPress Codex » Plugin API/Action Reference/save_post最新版との差分