web-dev-qa-db-ja.com

更新投稿時にフックする正しい方法は何ですか

私は投稿が更新されたときにフックしようとしますが、私はupdated_post_meta以外のすべてのフックを実行しようとしません

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

私はこのadd_action('save_post', 'my_function');を試しましたが、idがエコーアウトされなかったか、あるいはおそらくこのメッセージは既にエコーされていますがリダイレクトヘッダが送信されたために決してレンダリングされません。

15
rusly

投稿が更新されると、起動されるフックがいくつかあります。

  • 'pre_post_update'はただ起動されるアクションですbefore投稿が更新され、渡される引数は2です。$post_ID$dataallの配列です投稿テーブルのデータベース列
  • 'transition_post_status'は更新時に起動されるフックで、3つの引数を渡します:$ new_post_status、$old_post_status、および$post(オブジェクト)。
  • 次に、他の2つの遷移フックが起動されますが、それらは動的に名前が付けられます。つまり、起動される有効なアクションは、古い投稿ステータスと新しい投稿ステータスに依存します。 "{$old_status}_to_{$new_status}"および"{$new_status}_{$post->post_type}"。最初に唯一の投稿オブジェクトを引数として渡し、2番目に投稿IDと投稿オブジェクトを渡します。ドキュメントを検索 こちら
  • 'edit_post' 2つの引数を渡す:$post_IDおよび$post(オブジェクト)
  • 'post_updated' 3つの引数を渡します:$post_ID$post_after(更新後のオブジェクトのポスト)、$post_before(更新前のオブジェクトのポスト)
  • 別の動的フック:"save_post_{$post->post_type}"これは投稿タイプに依存します。標準の投稿の場合は'save_post_post'、ページの場合は'save_post_page'、このフックは3つの引数を渡します:$post_ID$post(オブジェクト)、$updateはブール値(trueまたはfalse)です。投稿が初めて保存されたとき。
  • 'save_post'これは、更新時と最初の保存時に起動され、前のフックの同じ3つの引数を渡します。
  • 'save_post_{$post_type}'これは、更新時と最初の保存時に発生し、前のフックの同じ最初の2つの引数を渡します。
  • 最後に'wp_insert_post'があります。これは、更新時と最初の保存時に起動され、前の2つのフックと同じ3つの引数を渡します。

これらのフックは、ポストが更新されるたびに、バックエンドの管理ページと wp_update_post または wp_insert_post 関数を使用して「手動」で更新されるたびに起動されます。

管理ページを使用して投稿が更新されると、追加のフックが起動します。例は'update_post_redirect'または'post_updated_messages'です。 (使用例については this および this WPSEの回答をご覧ください)。

いくつかのフック引数を使用したい場合は、それが最初ではなく、add_action呼び出しで明示的に宣言する必要があることに注意してください。

例えば。 '$update'フックの'save_post'引数(3番目)を使用する場合は、3$accepted_argsパラメーターとしてadd_actionに追加する必要があります( ドキュメントを参照 ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

timingに関する最後の注意:add_actionが呼び出されることを確認する必要がありますbeforeアクションがトリガーされるか、アクションがトリガーされます何もしない。

例えば。このコード:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

フックが起動された後にアクションが追加されるため、何も実行されません。これは簡単に認識できますが、実際のコードでは常にそうとは限りません。

51
gmazzap

なぜpost_updated_messagesをフックしないのですか。そうすれば、デフォルトのワードプレスの投稿が更新されたのと同じように、このメッセージを表示できます。

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

ここで例を見てください。

http://codex.wordpress.org/Function_Reference/register_post_type

post_updated_messagesの下

2
Jacob Rambo