问题描述

什么是我最早可以采取的行动,我可以在哪里可以访问全局 $post/$posts 变量在前端和后端?我试过看过 the Codex referenceAdam 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_resultsget_posts 这样的东西的问题是,每当你发布查询时,它都会运行。 'wp'仅在功能 WP::main()中触发,这是 WP 核心用于运行页面主要请求查询的功能。

对于帖子编辑屏幕,看起来像您可以使用的第一个钩子可以是'add_meta_boxes'。尽管它通过了全局 $post 对象作为第二个参数 (第一个是当前帖子的 $post_type),但您只需要确保在挂起时处于核心页面。

次佳解决办法

posts_results 是原始查询结果的过滤器。参见 wp-includes/query.php 第 2627 行。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。