当我需要处理$post
变量,我通常使用类来提前捕获和包装全局$post
变量,获取访问该变量的通用方法,而无需重复依赖全局变量。
class MyAdminPost
{
private static $post;
public static function init()
{
$p_get = filter_input(INPUT_GET, \'post\', FILTER_SANITIZE_NUMBER_INT);
$p_post = filter_input(INPUT_POST, \'post\', FILTER_SANITIZE_NUMBER_INT);
if ($p_get > 0 || $p_post > 0) {
self::$post = $p_get > 0 ? get_post($p_get) : get_post($p_post);
} elseif ($GLOBALS[\'pagenow\'] === \'post-new.php\') {
add_action(\'new_to_auto-draft\', function(\\WP_Post $post) {
if (is_null(MyAdminPost::$post)) {
MyAdminPost::$post = $post;
}
}, 0);
}
}
public function get()
{
return self::$post;
}
}
add_action(\'admin_init\', array(\'MyAdminPost\', \'init\'));
在管理加载的早期阶段,即
\'admin_init\'
钩
\'MyAdminPost\'
类查找随请求和存储相关的post对象一起发送的post ID变量。
这很有效post.php
第页,但不在上post-new.php
, 因为在那个页面上,帖子ID并没有随请求一起发送,因为它还不存在。在这种情况下,我将回调添加到\'new_to_auto-draft\'
这就是"{old_status}_to_{new_status}"
钩子可在创建帖子后立即存储帖子post-new.php
页
这样,在这两个页面中,post对象很早就存储在类属性中。
用法示例(过程)
function get_my_admin_post()
{
static $post = null;
if (is_null($post) && did_action(\'admin_init\')) {
$map = new MyAdminPost();
$post = $map->get();
}
return $post;
}
add_action(\'admin_head-post.php\', \'test\');
function test()
{
$post = get_my_admin_post();
}
用法示例(OOP)
class ClassThatUsesPostObject
{
private $post_provider;
function __construct(MyAdminPost $map)
{
$this->post_provider = $map;
}
function doSomethingWithPost()
{
$post = $this->post_provider->get();
}
}
好处您可以很早就获得post对象,其方式与两者兼容
post.php
和
post-new.php
页码,so in
all 在这些页面中激发的钩子您可以轻松访问post对象
删除任何全局$post
代码中的变量引用
您的代码可以单独测试