問題描述

當創建元框時,在每個元框功能中,似乎引用 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.phppost-new.php 頁面的方式獲得 Post 對象,所以在所有這些頁面中的所有鈎子都可以無縫地訪問 post 對象

  • 您刪除代碼中的任何全局 $post 變量引用

  • 您的代碼可以孤立地進行測試

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。