Khi tôi cần xử lý $post
biến trên quản trị viên, tôi thường sử dụng một lớp để sớm nắm bắt và bao bọc $post
biến toàn cục, có được một cách phổ biến để truy cập vào nó, mà không phụ thuộc vào biến toàn cục.
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'));
Trong giai đoạn đầu tải quản trị, đó là 'admin_init'
hook, 'MyAdminPost'
lớp tìm kiếm biến ID bài được gửi với yêu cầu và lưu trữ đối tượng bài liên quan.
Điều đó hoạt động trên post.php
trang, nhưng không phải trên post-new.php
, bởi vì trên trang đó ID bài đăng không được gửi với yêu cầu vì nó chưa tồn tại. Trong trường hợp đó, tôi thêm một cuộc gọi lại vào 'new_to_auto-draft'
đó là một cái "{old_status}_to_{new_status}"
móc để lưu bài viết ngay sau khi nó được tạo trên post-new.php
trang.
Theo cách này, trong cả hai trang, đối tượng bài được lưu trữ trong một thuộc tính lớp từ rất sớm.
Ví dụ sử dụng (Thủ tục)
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();
}
Ví dụ sử dụng (OOP)
class ClassThatUsesPostObject
{
private $post_provider;
function __construct(MyAdminPost $map)
{
$this->post_provider = $map;
}
function doSomethingWithPost()
{
$post = $this->post_provider->get();
}
}
Những lợi ích
bạn có thể có được đối tượng bài đăng từ rất sớm theo cách tương thích với cả hai trang post.php
và post-new.php
do đó, trong tất cả các móc nối được bắn trong các trang đó bạn có quyền truy cập để đăng đối tượng mà không cần nỗ lực
bạn xóa bất kỳ $post
tham chiếu biến toàn cục nào trong mã của bạn
mã của bạn trở nên có thể kiểm tra được