web-dev-qa-db-ja.com

Admin_initの後にsave_postsにフォークできないのはなぜですか?

私のプラグインのAJAXコールバックから "save_post"アクションにフックしようとしていますが、うまくいかないようです。実際、 "save_posts"へのフックは、いくつかの重要なアクション実行ポイント(例: "init"や "admin_init")からのみうまくいくように見えますが、他のものからはうまくいきません(例 "add_meta_boxes"コールバック)。

私の特定のケースでは、[投稿の編集]画面のボタンをクリックして新しいカスタムメタボックスを追加し、メタボックスのデータを適切に保存してもらいたいのです。しかし、もちろんそのボタンをクリックしてそのメタボックスを追加するまでに、私はすでに "save_post"アクションを一度フックしており、WPは再びそれをフックさせたくないようです。

WPソースコードを簡単に見ると、そのアクションを再度フックできないようにする必要がある明白な理由はわかりません。この見かけ上の制限を回避する方法、または少なくともそれが機能しない理由に関する説明はありますか。

3
danblaker

フックに関数を追加することはランタイム操作であり、それは永続的ではありません。どのようなフック操作をAjaxアクションで実行しても、それらは別々のWPインスタンスで実行され、Ajax応答が返されるとすぐに期限切れになります。それらは現在ロードされているページには影響しません。

通常どおり(Ajaxアクションではなく)機能をsave_postにフックし、それを処理するための追加のメタボックスを確認する必要があります。

2
Rarst

私は文字通り、関連する問題に頭を悩ませていましたが、これが私がオンラインで読んだ最初のことであり、私が間違っていたことへの確かな指針となりました。

結局、add_meta_boxessave_postより遅く呼び出されるので、メタボックスが作成される前に保存フックを設定する必要があります。最初は直感に反するように思えますが、マークアップは通常、Wordpressが処理を実行した後に生成されるため、メタボックスがレンダリングされる前にフックが設定されていることは理にかなっています。

ありがたいことに、私はadmin_initフックに結び付けられたコードを少し持っていました。それはsave_postの前に発火するので、すぐに問題を解決することは本当に簡単になりました。

もう一度、この質問を投稿していただきありがとうございます。それは私が探していたものではありませんでしたが、それは問題に対する答えをほのめかしていました。

1
akamaozu