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


19

私は投稿が更新されたときにフックしようとしますが、すべてのフックは決して実行されません 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はエコーアウトされませんでした、またはおそらくこのメッセージはすでにエコーされていますが、リダイレクトヘッダーが送信されているためレンダリングされません。


2
の後save_postにスペースがありますが、これはタイプミスですか、それとも元のコードにありましたか?また、開発中にデバッグ有効にします。
ミロ

タイプミスではなく、元のコードでは申し訳ありません@Milo
rusly

その場合は、新しい投稿を作成するときに、画面の左上隅に出力が表示されます。既存の投稿の保存はリダイレクトの前に行われるため、デバッグを有効にしていない限り、何も表示されません。
ミロ

回答:


55

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

  • 'pre_post_update'アクションだけで発射される前にポストが更新され、渡された引数が2以下のとおりです。$post_IDそして$dataそれは、の配列であるすべてのポストテーブルの他のデータベースcolums
  • 'transition_post_status'は、更新時に起動されるフックであり、3つの引数を渡します:$ new_post_status、$old_post_statusおよび$post(object)。
  • 次に、他の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'です。( 使用例については、こちらこの WPSEの回答をご覧ください)。

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

例えば、あなたが使用したい場合は'$update'、引数を(第三であること)の'save_post'フックあなたが追加する必要がある3よう$accepted_argsにPARAM 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 );
}

タイミングに関する最後の注意:アクションがトリガーさadd_actionれるに呼び出されることを確認する必要があります。そうでない場合は何も実行されません。

たとえば、このコード:

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

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


ダッシュボードで[新規追加](投稿、ページ、CPT)を押すと、 'save_post'アクションフックも起動されると思います。自分自身を確認するには、このコードを実行するだけです。function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );「save_post」アクションが公開ではなく新規追加で実行されるのはなぜですか?自動ドラフトの投稿を作成するには
lowtechsun

@lowtechsun Aで言われているように、フックは投稿が更新されるたびに、つまりDBに保存されるたびに起動されます。ページの読み込みに近い「新規追加」を押すと、WPはDBに保存されたドラフト投稿を作成し、フックが実行されるようにします。
gmazzap

お返事ありがとうございます。昨日これについて知り、これの概念は紛らわしいと思った。つまり、最初にページを開いて新しい投稿を追加します。この段階ではまだ投稿を作成していないと思いました。唯一の、私は公開ヒット私は新しいポストが作成されると思うだろう。このさらにI希望WPをとることは、自動ドラフトの投稿を削除しない場合、私は、Add Newを打つが、その後公開押すことなくページを残しますか?
lowtechsun

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.