当サイト、Codex 日本語版は今後積極的な更新は行わない予定です。後継となる新ユーザーマニュアルは、https://ja.wordpress.org/support/ にあります。
万が一、当サイトで重大な問題を発見した際などは、フォーラムWordSlack #docs チャンネルでお知らせください。</p>

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

提供: WordPress Codex 日本語版
< プラグイン API‎ | アクションフック一覧
2018年4月27日 (金) 17:18時点におけるGblsm (トーク | 投稿記録)による版 (途中まで和訳。)

移動先: 案内検索

このページ「プラグイン API/アクションフック一覧/save post」は「用例」節以降が未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています

説明

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つのパラメータを使う場合(10はアクションを実行する優先度の例です):

<?php add_action( 'save_post', 'function_name', 10, 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 );

See also quick_edit_custom_box: Creating Inputs.

NOTE: As of WP 3.7, an alternative action has been introduced, which is called for specific post types: save_post_{post_type}. Hooking to this action you wouldn't have to check on the post type (ie: if ( $slug != $_POST['post_type'] ) in the sample above).

Avoiding infinite loops

If you are calling a function such as wp_update_post that includes the save_post hook, your hooked function will create an infinite loop. To avoid this, unhook your function before calling the function you need, then re-hook it afterward.

<?php
// this function makes all posts in the default category private

function set_private_categories($post_id) {
	// If this is a revision, get real post ID
	if ( $parent_id = wp_is_post_revision( $post_id ) ) 
		$post_id = $parent_id;

	// Get default category ID from options
	$defaultcat = get_option( 'default_category' );

	// Check if this post is in default category
	if ( in_category( $defaultcat, $post_id ) ) {
		// unhook this function so it doesn't loop infinitely
		remove_action( 'save_post', 'set_private_categories' );

		// update the post, which calls save_post again
		wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );

		// re-hook this function
		add_action( 'save_post', 'set_private_categories' );
	}
}
add_action( 'save_post', 'set_private_categories' );
?>

NOTE: It is very important to use the same parameters in remove_action than in add_action. Example with priority below (extract)... if the parameters are not the same, the infinite loop occurs... :-(

// unhook this function so it doesn't loop infinitely
		remove_action( 'save_post', 'set_private_categories', 13, 2 );

		// update the post, which calls save_post again
		wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );

		// re-hook this function
		add_action( 'save_post', 'set_private_categories', 13, 2 );
	}
}
add_action( 'save_post', 'set_private_categories', 13, 2 );

Change Log

Source File

Triggered by wp_insert_post and wp_publish_post in wp-includes/post.php

Related

Actions

Filters

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