問題描述
當創建元框時,在每個元框功能中,似乎引用 global $post 作為參數傳遞為 ($event)。我喜歡這個,因為它似乎是一致的,並且不太可能用 $post 變量來聲明它,因為我在其他地方已經明確地聲明瞭這一點。
add_action('admin_init', 'events_admin');
function events_admin()
{
add_meta_box('display_events_date_meta_box',
'Dates',
'display_events_date_meta_box',
'events', 'normal', 'high'
);
}
function display_events_date_meta_box($event) // Referenced
{
//$event in this case is the $post global
}
我已經創建了一個過濾器和各種其他功能,目前只使用 global $post 變量。
add_action( 'admin_head-post-new.php', 'test' );
add_action( 'admin_head-post.php', 'test' );
function test()
{
global $post; // Declared explicitly
}
有沒有一個標準/推薦的方式來傳遞 global $post 變量作為這些功能的參數?
最佳解決方案
當我需要在管理員處理 $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'類查找發送與請求和存儲相關的後期對象的帖子 ID 變量。
這在 post.php 頁面上工作,但不是在 post-new.php 上,因為在該頁面上,由於它還沒有發送請求,因此不發送請求。在這種情況下,我向'new_to_auto-draft'添加回調,'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();
}
}
Benefits
-
您可以以兼容
post.php和post-new.php頁面的方式獲得 Post 對象,所以在所有這些頁面中的所有鈎子都可以無縫地訪問 post 對象 -
您刪除代碼中的任何全局
$post變量引用 -
您的代碼可以孤立地進行測試
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。