减少全球员额的使用

时间:2015-01-09 作者:myol

在创建元框时,在每个元框函数中,它似乎是对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 变量作为这些函数的参数?

3 个回复
最合适的回答,由SO网友:gmazzap 整理而成

当我需要处理$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.phppost-new.php 页码,so inall 在这些页面中激发的钩子您可以轻松访问post对象

删除任何全局$post 代码中的变量引用

您的代码可以单独测试

SO网友:Milo

admin_head-{$hook_suffix} 在每个管理页面上都会触发,因此向该函数传递任何内容可能都没有意义。您可以在source中看到,没有传递任何参数:

do_action( "admin_head-$hook_suffix" );
在许多情况下,你别无选择global $post, 如果您仔细查看任何核心源文件,您将看到global 到处都是垃圾,这主要是由于核心的程序性构造和保持向后兼容性的主要目标。它很凌乱,但大部分是无害的if you\'re just accessing its value within a known context.

SO网友:Mark Kaplun

您无法轻松修改与现有筛选器/操作一起使用的参数,因为它们是由“调用”代码设置的,因此您无法插入其他参数。通过破解do\\u action/apply\\u filter背后的核心代码,可能会实现这一点,但如果成功,则很可能会破坏挂接这些操作/过滤器的所有其他代码。

结束