web-dev-qa-db-ja.com

確実に$ post / $ postsを取得するための最も早いフック

フロントエンドとバックエンドの両方でグローバルな$post/$posts変数にアクセスできるようになるために私がフックできる最も早いアクションは何ですか?私は コーデックスの参考文献Adam Brownの参考文献 を見て、何度かソースを読み飛ばしてみましたが、良いものを見つけるのにはまだうまくいっていません。

pre_get_postsは早すぎます。コールバック中に2回目のget_posts()呼び出しを行いたい場合、posts_selectionの使用は機能しません。 template_redirectは管理者側では動作しません。 the_postはフロントエンドのtemplate_redirectより早いかもしれませんが、バックエンドでも動作しません。理想的にはget_post()/get_posts()が戻る直前に実行されるものが欲しいのですが、私はそのようなものを見ていません。

私は過去にthe_postsフィルタを使用しましたが、技術的に正しいのでアクションをお勧めします。

今は2回だけフックしています。フロントエンドにtemplate_redirectを使い、バックエンドにadmin_xml_nsを使います。私のロジックはこれらのフックのどちらにも意味的に関連していないので、私はあまり好きではありません。これは非常に一般的なニーズであり、 "post_get_posts"(ala pre_get_posts)のようなフックがあるはずです。両側で動作します。

8
Ian Dunn

個々の編集後の画面(wp-admin/post.php)を除くすべての管理ページとフロントエンドページで、'wp'はグローバルな値を取得するための最も信頼性の高いフックです。

http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-includes/class-wp.php.source.html#l486

WP::main()WP::register_globals()を起動した直後に起動することがわかります。 post_resultsget_postsのようなものを使うことの問題点は、投稿に対する問い合わせをするたびに実行されるということです。 'wp'は、関数WP::main()でのみ起動されます。これは、WP coreがページのメインリクエストクエリを実行するために使用するものです。

編集後の画面では、確実に使用できる最初のフックは'add_meta_boxes'です。あなたがフックインするとき、あなたがコアページにいることを確認する必要があるだけですが、それはグローバルな$postオブジェクトを第2引数として渡します(最初は現在の投稿の$post_typeです)。

12
John P Bloch

posts_resultsは、生のクエリ結果に対するフィルタです。 wp-includes/query.phpの2627行目を参照してください。

4
Milo