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

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

提供: WordPress Codex 日本語版
移動先: 案内検索
(途中まで和訳。)
(残りを和訳。)
1行目: 1行目:
{{NeedTrans|「用例」節以降が}}
+
{{CheckTrans}}
  
 
== 説明<span id="Description"></span> ==
 
== 説明<span id="Description"></span> ==
5行目: 5行目:
 
<code>save_post</code> は投稿や固定ページが作成または更新されたとき実行されるアクションです。インポート、投稿や固定ページの編集画面、XMLRPC、メールによる投稿などがきっかけになります。投稿データは投稿の編集方法に応じて <var>$_POST</var>, <var>$_GET</var> またはグローバルの <var>$post_data</var> に保存されます。例えばクイック編集は <var>$_POST</var> を使います。
 
<code>save_post</code> は投稿や固定ページが作成または更新されたとき実行されるアクションです。インポート、投稿や固定ページの編集画面、XMLRPC、メールによる投稿などがきっかけになります。投稿データは投稿の編集方法に応じて <var>$_POST</var>, <var>$_GET</var> またはグローバルの <var>$post_data</var> に保存されます。例えばクイック編集は <var>$_POST</var> を使います。
  
このアクションは投稿が保存された直後に実行されるので、 <code>get_post($post_id)</code> を使ってその投稿オブジェクトを簡単にアクセスできます。
+
このアクションは投稿が保存された直後に実行されるので、<tt>get_post( $post_id )</tt> を使ってその投稿オブジェクトを簡単にアクセスできます。
  
訳注: 2番目の引数が WP_Post オブジェクトなので <tt>get_post()</tt> を使わずに投稿データを参照できます。
+
訳注: 2番目の引数(WP_Post オブジェクト)を利用して <tt>get_post()</tt> を使わずに投稿データを参照できます。
  
 
== 使い方 ==
 
== 使い方 ==
15行目: 15行目:
 
  <?php add_action( 'save_post', 'function_name' ); ?>
 
  <?php add_action( 'save_post', 'function_name' ); ?>
  
3つのパラメータを使う場合(10は[[関数リファレンス/add_action|アクションを実行する優先度]]の例です):
+
3つのパラメータを使う場合(13は[[関数リファレンス/add_action|アクションを実行する優先度]]の例です):
  
  <?php add_action( 'save_post', 'function_name', 10, 3 ); ?>
+
  <?php add_action( 'save_post', 'function_name', 13, 3 ); ?>
  
 
== パラメータ ==
 
== パラメータ ==
61行目: 61行目:
 
  * 投稿が保存されたとき投稿メタデータも保存する。
 
  * 投稿が保存されたとき投稿メタデータも保存する。
 
  *
 
  *
  * @param int $post_ID 投稿 ID。
+
  * @param int $post_ID 投稿 ID。
  * @param post $post 投稿オブジェクト。
+
  * @param post $post     投稿オブジェクト。
  * @param bool $update 既存投稿の更新か否か。
+
  * @param bool $update   既存投稿の更新か否か。
 
  */
 
  */
 
function save_book_meta( $post_ID, $post, $update ) {
 
function save_book_meta( $post_ID, $post, $update ) {
97行目: 97行目:
 
</pre>
 
</pre>
  
See also [[Plugin API/Action Reference/quick_edit_custom_box#Creating_Inputs|quick_edit_custom_box: Creating Inputs]].
+
[[プラグイン API/アクションフック一覧/quick_edit_custom_box#Creating_Inputs|quick_edit_custom_box: 入力の作成]] も見てください。
  
'''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: <tt>if ( $slug != $_POST['post_type'] )</tt> in the sample above).
+
'''参考:''' WP 3.7 において別のアクションが導入されました。特定の投稿タイプについて呼び出される ''save_post_{post_type}'' です。そのため、このアクションにフックした関数では投稿タイプをチェックしなくても構いません(上の例で <code>if ( "book" != get_post_type( $post_ID ) )</code> の部分)。
  
=== Avoiding infinite loops ===
+
=== 無限ループ回避<span id="Avoiding infinite loops"></span> ===
  
If you are calling a function such as <tt>wp_update_post</tt> that includes the <tt>save_post</tt> 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.
+
<tt>wp_update_post()</tt> のようにフック <tt>save_post</tt> を含む関数を呼び出すと、フックした関数が無限ループを引き起こします。これを避けるには、必要な関数を呼ぶ前に自分(関数)をフック解除し、終わってから改めてフックします。
  
 
<pre>
 
<pre>
 
<?php
 
<?php
// this function makes all posts in the default category private
+
// この関数はデフォルトのカテゴリーが付いたすべての投稿を非公開(private)にします。
  
 
function set_private_categories($post_id) {
 
function set_private_categories($post_id) {
// If this is a revision, get real post ID
+
// リビジョンなら本物の投稿の ID を取得
 
if ( $parent_id = wp_is_post_revision( $post_id ) )  
 
if ( $parent_id = wp_is_post_revision( $post_id ) )  
 
$post_id = $parent_id;
 
$post_id = $parent_id;
  
// Get default category ID from options
+
// オプションからデフォルトのカテゴリーの ID を取得
 
$defaultcat = get_option( 'default_category' );
 
$defaultcat = get_option( 'default_category' );
  
// Check if this post is in default category
+
// 投稿がデフォルトのカテゴリーであるか確かめる
 
if ( in_category( $defaultcat, $post_id ) ) {
 
if ( in_category( $defaultcat, $post_id ) ) {
// unhook this function so it doesn't loop infinitely
+
// 自分をフック解除して無限ループさせない
 
remove_action( 'save_post', 'set_private_categories' );
 
remove_action( 'save_post', 'set_private_categories' );
  
// update the post, which calls save_post again
+
// 投稿を更新するので save_post がもう一度呼ばれる
 
wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );
 
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' );
 
}
 
}
133行目: 133行目:
 
</pre>
 
</pre>
  
<strong>NOTE:</strong> It is very important to use the same parameters in <tt>remove_action</tt> than in <tt>add_action</tt>. Example with priority below (extract)... if the parameters are not the same, the infinite loop occurs... :-(
+
<strong>参考:</strong> <tt>remove_action()</tt> <tt>add_action()</tt> に同じパラメータを与えることがとても重要です。優先順を指定する例(抜粋)を見てください... パラメータが違うと、無限ループが起きます... :-(
 
<pre>
 
<pre>
// unhook this function so it doesn't loop infinitely
+
// 自分をフック解除して無限ループさせない
 
remove_action( 'save_post', 'set_private_categories', 13, 2 );
 
remove_action( 'save_post', 'set_private_categories', 13, 2 );
  
// update the post, which calls save_post again
+
// 投稿を更新するので save_post がもう一度呼ばれる
 
wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );
 
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 );
 
}
 
}
148行目: 148行目:
 
</pre>
 
</pre>
  
== Change Log ==
+
== 変更履歴<span id="Change_Log"></span> ==
  
* Since [[Version 2.0|2.0]]
+
* 2.0 : 新規導入。
* Moved from {{Trac|wp-includes/functions-post.php}} to {{Trac|wp-includes/post.php}} in [[Version 2.1|2.1]]
+
* [[Version 2.1|2.1]]: {{Trac|wp-includes/functions-post.php}} から {{Trac|wp-includes/post.php}} へ移動。
* Triggered separately by [[Function Reference/wp_publish_post|wp_publish_post]] in [[Version 2.3|2.3]] (before this version, <code>wp_publish_post</code> called <code>wp_insert_post</code>).
+
* [[Version 2.3|2.3]]: [[関数リファレンス/wp_publish_post|wp_publish_post()]] から別にトリガーされるようになりました(このバージョンより前は <code>wp_publish_post()</code> <code>wp_insert_post()</code> を呼び出していました)。
  
== Source File ==
+
== ソースファイル<span id="Source_File"></span> ==
  
Triggered by [[Function Reference/wp_insert_post|wp_insert_post]] and [[Function Reference/wp_publish_post|wp_publish_post]] in {{Trac|wp-includes/post.php}}
+
{{Trac|wp-includes/post.php}} にある [[関数リファレンス/wp_insert_post|wp_insert_post()]] および [[関数リファレンス/wp_publish_post|wp_publish_post()]] によりトリガーされます。
  
== Related ==
+
== 関連項目<span id="Related"></span> ==
  
=== Actions ===
+
=== アクション<span id="Actions"></span> ===
* Adding columns to post lists
+
** [[Plugin API/Action Reference/manage_pages_custom_column|manage_pages_custom_column]]
+
** [[Plugin API/Action Reference/manage_posts_custom_column|manage_posts_custom_column]]
+
** [[Plugin API/Action Reference/manage_$post_type_posts_custom_column|manage_${post_type}_posts_custom_column]]
+
** [[Plugin API/Action Reference/quick_edit_custom_box|quick_edit_custom_box]]
+
* Saving
+
** [[Plugin API/Action Reference/edit_post|edit_post]]
+
** [[Plugin API/Action Reference/save_post|save_post]]
+
** [[Plugin API/Action Reference/wp_insert_post|wp_insert_post]]
+
** [[Post Status Transitions]]
+
  
=== Filters ===
+
* 投稿一覧へカラムを追加:
* [[Plugin API/Filter Reference/manage_pages_columns|manage_pages_columns]]
+
** [[プラグイン API/アクションフック一覧/manage_pages_custom_column|manage_pages_custom_column]] /[[:en:Plugin API/Action Reference/manage_pages_custom_column|en]]
* [[Plugin API/Filter Reference/manage_posts_columns|manage_posts_columns]]
+
** [[プラグイン API/アクションフック一覧/manage_posts_custom_column|manage_posts_custom_column]] /[[:en:Plugin API/Action Reference/manage_posts_custom_column|en]]
* [[Plugin API/Filter Reference/manage_edit-post_type_columns|manage_edit-${post_type}_columns]]
+
** [[プラグイン API/アクションフック一覧/manage_$post_type_posts_custom_column|manage_${post_type}_posts_custom_column]] /[[:en:Plugin API/Action Reference/manage_$post_type_posts_custom_column|en]]
* [[Plugin API/Filter Reference/manage_$post_type_posts_columns|manage_${post_type}_posts_columns]]
+
** [[プラグイン API/アクションフック一覧/quick_edit_custom_box|quick_edit_custom_box]] /[[:en:Plugin API/Action Reference/quick_edit_custom_box|en]]
* [[Plugin API/Filter Reference/redirect_post_location|redirect_post_location]] - redirects a user to a certain location after a post save
+
* 保存:
 +
** [[プラグイン API/アクションフック一覧/edit_post|edit_post]] /[[:en:Plugin API/Action Reference/edit_post|en]]
 +
** [[プラグイン API/アクションフック一覧/save_post|save_post]] /[[:en:Plugin API/Action Reference/save_post|en]]
 +
** [[プラグイン API/アクションフック一覧/wp_insert_post|wp_insert_post]] /[[:en:Plugin API/Action Reference/wp_insert_post|en]]
 +
** [[投稿ステータスの遷移]]
 +
 
 +
=== フィルター<span id="Filters"></span> ===
 +
 
 +
* [[プラグイン API/フィルターフック一覧/manage_pages_columns|manage_pages_columns]] /[[:en:Plugin API/Filter Reference/manage_pages_columns|en]]
 +
* [[プラグイン API/フィルターフック一覧/manage_posts_columns|manage_posts_columns]] /[[:en:Plugin API/Filter Reference/manage_posts_columns|en]]
 +
* [[プラグイン API/フィルターフック一覧/manage_edit-post_type_columns|manage_edit-${post_type}_columns]] /[[:en:Plugin API/Filter Reference/manage_edit-post_type_columns|en]]
 +
* [[プラグイン API/フィルターフック一覧/manage_$post_type_posts_columns|manage_${post_type}_posts_columns]] /[[:en:Plugin API/Filter Reference/manage_$post_type_posts_columns|en]]
 +
* [[プラグイン API/フィルターフック一覧/redirect_post_location|redirect_post_location]] /[[:en:Plugin API/Filter Reference/redirect_post_location|en]] - 投稿を保存した後ユーザーを特定の URL へリダイレクトする
  
 
{{原文|Plugin API/Action Reference/save_post|158375}} <!-- 19:01, 20 September 2016 Taotiago 版 -->
 
{{原文|Plugin API/Action Reference/save_post|158375}} <!-- 19:01, 20 September 2016 Taotiago 版 -->

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

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