web-dev-qa-db-ja.com

新しい投稿を作成するときにsave_postアクションが起動するのはなぜですか?

save_postアクションに追加した自分の機能が、管理ダッシュボードの[新規投稿]リンクをクリックしたときに起動するという事実に驚きました。注 - これは私が押す前です Save または Updateそして、経過時間や自動更新の後ではなく、すぐに起動します。

一方で、何かを入力して Publish または Update または Save Draft ボタン、アクションハンドラの中に置いたecho文はエコーアウトしないので、それ以外のときにはアクションは発生していないようです。これは無関係かもしれません。

これが私のコードです:

add_action('save_post', 'MyNS\save_event_metabox', 10, 2);
function save_event_metabox($post_id, $post){
  echo "<h1>YES!</h1>";
}

この「はい」は、「新しい投稿」リンクを押したときに(ページ上部に)表示されますが、何かを入力してからを押したときには表示されません。 Update または Publish または Save Draft。これはsave_postアクションとwp_insert_post()関数に関するドキュメントと矛盾するようです。

誰もが私のためにこれを片付けることができますか?

31
Tom Auger

[新しい投稿]をクリックすると、単にページwp-admin/post-new.phpが読み込まれます。

そうすることで、WordPressは常に新しい投稿( '自動ドラフト')を作成し、他のすべての機能(メディアのアップロードなど)やプラグインが通常どおりに動作するようにします。 you 実際にドラフトを保存するポスト。

そしてこれが、今度はsave_postをトリガーします。それであなたのエコー。

それでは、更新または公開時にエコーが表示されないのはなぜですか。

保存から次のページロードまでの間に、WordPressは実際には同じページにGETリダイレクトを送信します。これは透明に見えます(これは HttpFox などのHTTPモニターで確認できます)。

言い換えると;

  1. UpdateまたはPublishをクリックした
  2. ブラウザはデータをサーバーに送信します
  3. WordPressがそれを処理し、その過程でsave_postをトリガーします
  4. WordPressはリダイレクトヘッダを送り返して、ブラウザの出力が表示される前に終了します(エコーを含む)。
  5. ブラウザはリダイレクトに従い、「投稿の編集」ページを読み込みます。

リダイレクトは不要に思えるかもしれませんが(同じページにPOSTを付けることができるため)、 Post/Redirect/Get として知られる手法の一部であり、 フォームの重複送信 を避けます。

save_postにフックされた関数の結果に基づいてカスタムメッセージをプリントアウトしようとしているなら、 これらの質問/回答 をチェックしてください。

*厳密には真実ではない、あなたのエコーは実際にはリダイレクトヘッダが送信される前に発生しますが、ブラウザはそれを捨てるでしょう、あるいは事態はそれほど速くレンダリングされません。

37
TheDeadMedic