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

「プラグイン API/アクションフック一覧/save post」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(en:Plugin API/Action Reference/save_post 19:01, 20 September 2016 Taotiago 版を流し込み。)
 
(途中まで和訳。)
1行目: 1行目:
== Description ==
+
{{NeedTrans|「用例」節以降が}}
<code>save_post</code> is an action triggered whenever a post or page is created or updated, which could be from an import, post/page edit form, xmlrpc, or post by email. The data for the post is stored in <var>$_POST</var>, <var>$_GET</var> or the global <var>$post_data</var>, depending on how the post was edited. For example, quick edits use <var>$_POST</var>.
+
  
Since this action is triggered right after the post has been saved, you can easily access this post object by using <code>get_post($post_id)</code>
+
== 説明<span id="Description"></span> ==
  
== Examples ==
+
<code>save_post</code> は投稿や固定ページが作成または更新されたとき実行されるアクションです。インポート、投稿や固定ページの編集画面、XMLRPC、メールによる投稿などがきっかけになります。投稿データは投稿の編集方法に応じて <var>$_POST</var>, <var>$_GET</var> またはグローバルの <var>$post_data</var> に保存されます。例えばクイック編集は <var>$_POST</var> を使います。
  
Below is a basic example that will send an email every time a post or page is updated on your website.
+
このアクションは投稿が保存された直後に実行されるので、 <code>get_post($post_id)</code> を使ってその投稿オブジェクトを簡単にアクセスできます。
 +
 
 +
訳注: 2番目の引数が WP_Post オブジェクトなので <tt>get_post()</tt> を使わずに投稿データを参照できます。
 +
 
 +
== 使い方 ==
 +
 
 +
投稿 ID のみを使う場合:
 +
 
 +
<?php add_action( 'save_post', 'function_name' ); ?>
 +
 
 +
3つのパラメータを使う場合(10は[[関数リファレンス/add_action|アクションを実行する優先度]]の例です):
 +
 
 +
<?php add_action( 'save_post', 'function_name', 10, 3 ); ?>
 +
 
 +
== パラメータ ==
 +
 
 +
フックされたアクション関数には以下のパラメータが渡されます。
 +
 
 +
{{Parameter|$post_ID|整数|投稿 ID。}}
 +
{{Parameter|$post|WP_Post オブジェクト|投稿データ。}}
 +
{{Parameter|$update|真偽値|既存投稿の更新なら true, 新規投稿なら false。}}
 +
 
 +
== 用例<span id="Examples"></span> ==
 +
 
 +
=== 基本的な例 ===
 +
 
 +
ウェブサイトの投稿や固定ページが更新されるたびにメールを送信します。
  
 
<pre>
 
<pre>
function my_project_updated_send_email( $post_id ) {
+
function my_project_updated_send_email( $post_ID ) {
  
// If this is just a revision, don't send the email.
+
// リビジョンならメールを送らない。
if ( wp_is_post_revision( $post_id ) )
+
if ( wp_is_post_revision( $post_ID ) )
 
return;
 
return;
  
$post_title = get_the_title( $post_id );
+
$post_title = get_the_title( $post_ID );
$post_url = get_permalink( $post_id );
+
$post_url = get_permalink( $post_ID );
$subject = 'A post has been updated';
+
$subject = '投稿が更新されました';
  
$message = "A post has been updated on your website:\n\n";
+
$message = "サイトで投稿が更新されました:\n\n";
 
$message .= $post_title . ": " . $post_url;
 
$message .= $post_title . ": " . $post_url;
  
// Send email to admin.
+
// 管理者へメールを送る。
 
wp_mail( 'admin@example.com', $subject, $message );
 
wp_mail( 'admin@example.com', $subject, $message );
 
}
 
}
28行目: 53行目:
 
</pre>
 
</pre>
  
=== Custom Post Type: 'book' ===
+
=== カスタム投稿タイプ: 'book'<span id="Custom_Post_Type:_.27book.27"></span> ===
Suppose you have a 'book' custom post type and you add the book author, publisher and whether or not the book is in print when editing. Here's how you could save this information as metadata:
+
 
 +
'book' (本) というカスタム投稿タイプがあり、著者、出版社、出版中かどうか (in print) を書くとします。次の例は、これらの情報をメタデータに保存します:
  
 
<pre>
 
<pre>
 
/**
 
/**
  * Save post metadata when a post is saved.
+
  * 投稿が保存されたとき投稿メタデータも保存する。
 
  *
 
  *
  * @param int $post_id The post ID.
+
  * @param int $post_ID 投稿 ID。
  * @param post $post The post object.
+
  * @param post $post 投稿オブジェクト。
  * @param bool $update Whether this is an existing post being updated or not.
+
  * @param bool $update 既存投稿の更新か否か。
 
  */
 
  */
function save_book_meta( $post_id, $post, $update ) {
+
function save_book_meta( $post_ID, $post, $update ) {
  
 
     /*
 
     /*
     * In production code, $slug should be set only once in the plugin,
+
     * 本番環境のコードでは、スラッグはプラグイン内で一度だけセットすべきです。
     * preferably as a class property, rather than in each function that needs it.
+
     * クラスのプロパティが良いでしょう。必要とする関数ごとにスラッグを書くのではなく。
 
     */
 
     */
     $post_type = get_post_type($post_id);
+
     $post_type = get_post_type( $post_ID );
  
     // If this isn't a 'book' post, don't update it.
+
     // 'book' の投稿でなければ、更新しない。
     if ( "book" != $post_type ) return;
+
     if ( "book" != $post_type )
 +
        return;
  
     // - Update the post's metadata.
+
     // 投稿メタデータを更新する。
  
     if ( isset( $_POST['book_author'] ) ) {
+
     if ( isset( $_POST['book_author'] ) ) { // 著者
         update_post_meta( $post_id, 'book_author', sanitize_text_field( $_POST['book_author'] ) );
+
         update_post_meta( $post_ID, 'book_author', sanitize_text_field( $_POST['book_author'] ) );
 
     }
 
     }
  
     if ( isset( $_POST['publisher'] ) ) {
+
     if ( isset( $_POST['publisher'] ) ) { // 出版社
         update_post_meta( $post_id, 'publisher', sanitize_text_field( $_POST['publisher'] ) );
+
         update_post_meta( $post_ID, 'publisher', sanitize_text_field( $_POST['publisher'] ) );
 
     }
 
     }
  
     // Checkboxes are present if checked, absent if not.
+
     // チェックされていたらデータがあり、されていなければデータはない。
     if ( isset( $_POST['inprint'] ) ) {
+
     if ( isset( $_POST['inprint'] ) ) { // 出版中かどうか
         update_post_meta( $post_id, 'inprint', TRUE );
+
         update_post_meta( $post_ID, 'inprint', TRUE );
 
     } else {
 
     } else {
         update_post_meta( $post_id, 'inprint', FALSE );
+
         update_post_meta( $post_ID, 'inprint', FALSE );
 
     }
 
     }
 
}
 
}

2018年4月27日 (金) 17:18時点における版

このページ「プラグイン 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最新版との差分