web-dev-qa-db-ja.com

グローバル$ postの使用を減らす

メタボックスを作成するとき、各メタボックス関数ではglobal $postへの参照はパラメータ($event)として渡されます。これは一貫性があり、$post varを他の場所で読んだように明示的に宣言することによって曖昧にする可能性が低いように思われるため、これをお勧めします。

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変数を渡すための標準的な/推奨される方法はありますか?

7
myol

Adminで$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では機能しません。なぜなら、そのページにはまだ投稿IDが存在しないためリクエストで送信されないからです。その場合、'new_to_auto-draft'ページに投稿が作成された直後に投稿を保存するための "{old_status}_to_{new_status}" フックの1つであるコールバックをpost-new.phpに追加します。

このように、両方のページで、ポストオブジェクトは非常に早くクラスプロパティに格納されます。

使用例(手続き)

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.phpページとpost-new.phpページの両方と互換性のある方法で、非常に早い時期にpostオブジェクトを取得できます。そのため、allでそれらのページで起動されたフックで、投稿オブジェクトにアクセスできます

  • コード内のグローバルな$post変数参照をすべて削除します。

  • あなたのコードは単独でテスト可能になります

8
gmazzap

admin_head-{$hook_suffix}はすべての管理ページで起動されるので、その関数に何かを渡しても意味がありません。引数が渡されていないことがソースでわかります。

do_action( "admin_head-$hook_suffix" );

多くの場合、global $postに代わるものはなく、ほとんどすべてのコアソースファイルを見てみると、ほとんど手続き的なコアの構築と下位互換性を維持するための主な目的のために、至る所にglobalがあります。それは乱雑だが大抵無害です もしあなたが既知の文脈の中でその値にアクセスしているのであれば

1
Milo

「呼び出し」コードによって設定されているため、既存のフィルター/アクションで使用されているパラメーターを簡単に変更することはできません。そのため、追加のパラメーターを挿入することはできません。 do_action/apply_filterの背後にあるコアコードをハッキングすることでこれを行う可能性があるかもしれませんが、成功すれば、おそらくこれらのアクション/フィルターをフックする他のすべてのコードを壊すでしょう。

1
Mark Kaplun