问题描述
什么是我最早可以采取的行动,我可以在哪里可以访问全局 $post/$posts
变量在前端和后端?我试过看过 the Codex reference,Adam Brown’s reference 和撇去源头几次,但没有多少运气找到一个好的。
pre_get_posts
太早了如果要在回调期间进行第二次 get_posts() 呼叫,则使用 posts_selection
不起作用; 而 template_redirect
不在管理端运行。 the_post
可能早于 template_redirect
为前端,但也不会在后端运行。理想情况下,我会想要在 get_post()/get_posts()
返回之前运行的东西,但我没有看到任何类似的东西。
过去我已经使用了 the_posts
过滤器,但是我更喜欢采用一种操作,因为它在技术上更正确。
现在我只是两次挂着; 一旦使用 template_redirect
作为前端,并再次使用 admin_xml_ns
作为后端。我不太喜欢这个,因为我的逻辑与任何一个钩子都没有语义关联,而且这似乎是一个非常常见的需求,应该有像”post_get_posts”(ala pre_get_posts
) 这样的钩子双方。
最佳解决办法
对于除单独的帖子编辑屏幕 (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_results
和 get_posts
这样的东西的问题是,每当你发布查询时,它都会运行。 'wp'
仅在功能 WP::main()
中触发,这是 WP 核心用于运行页面主要请求查询的功能。
对于帖子编辑屏幕,看起来像您可以使用的第一个钩子可以是'add_meta_boxes'
。尽管它通过了全局 $post
对象作为第二个参数 (第一个是当前帖子的 $post_type
),但您只需要确保在挂起时处于核心页面。
次佳解决办法
posts_results
是原始查询结果的过滤器。参见 wp-includes/query.php
第 2627 行。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。