在类中注册帖子类型时添加Meta框

时间:2019-01-31 作者:Omkar Totade

我试图通过一个类为自定义帖子类型添加几个元框。我正在使用"register_meta_box_cb" 参数,以指定用于添加元框的回调函数。

示例代码-(我的代码大纲)-

class ABC
{
  public static function add_customposttype()
  {
    $abc_o = new ABC();
    $abc_o->reg();
  }

  public function reg()
  {
    $args = array(
      "label" => "ABC",
      "description" => "New CPT",
      "public" => true,
      "register_meta_box_cb" => array($this, "meta_box_callback")
    );
    register_post_type("abc", $args);
  } 

    public function meta_box_callback()
    {
      $meta_fields = get_all_meta_fields();   //  This gets me an array of objects of classes \'c_box, b_box and a_box\'

      foreach($meta_fields as $object)
      {
        add_meta_box($object->name, $object->label, array($object, \'render_meta_box\'), \'abc\', $object->context, $object->priority);
      }
    }
}

class c_box
{
  public $name;
  public $label;
  public $context;
  public $priority;

  public function __construct()
  {
    $this->name = \'c_box\';
    $this->label = \'C Box\';
    $this->context = \'normal\';
    $this->priority = \'high\';
  }

  public function render_meta_box($post)
  {
    echo "<p>This is a C Box</p>";    //  Never executes
  }
}

class b_box
{
  public $name;
  public $label;
  public $context;
  public $priority;

  public function __construct()
  {
    $this->name = \'b_box\';
    $this->label = \'B Box\';
    $this->context = \'normal\';
    $this->priority = \'high\';
  }

  public function render_meta_box($post)
  {
    echo "<p>This is a B Box</p>";    //  Never executes
  }
}

class a_box
{
  public $name;
  public $label;
  public $context;
  public $priority;

  public function __construct()
  {
    $this->name = \'a_box\';
    $this->label = \'A Box\';
    $this->context = \'normal\';
    $this->priority = \'high\';
  }

  public function render_meta_box($post)
  {
    echo "<p>This is a A Box</p>";    //  Never executes
  }
}
所以我为不同的元框定义了不同的类。我希望他们都有一个共同点render_meta_box 函数,这样我就可以创建所有这些类的对象,将它们放在一个数组中并遍历它,这样我就可以调用render_meta_box 一个接一个地为它们所有的函数。

基本上,元框将有自己的类,其中render_meta_box 函数和其他一些函数,我可以为这些类中的每一个创建一个对象,并逐个运行它们的函数,这样以后就可以很容易地添加新的元框。

我面临的问题是,当我定义render_meta_box 方法在单独的类中,其中包含要回显的HTML代码,如下所示add_meta_box 从不执行该回调函数。我试着看看能不能让它在render_meta_box 方法,但它从未到达该打印语句。

我错过什么了吗?我想我可以打电话给render_meta_box 方法使用不同的对象使它们都以不同的方式执行,我的方法是否不正确?

提前感谢!

2 个回复
SO网友:Justin Waulters

欢迎光临!

拥有更完整的代码并显示如何调用这些方法会很有帮助。然而,我看到的一件事可能是你的问题的一部分,那就是你打电话的方式add_meta_box().

add_meta_box() 应在add_meta_boxes 行动我从未尝试过将其作为register_post_type() 之前但是,假设你正在跑步register_post_type() 在期间init, 我想add_meta_box() 将在init 太-功能可用之前。

如果WP实际尝试运行add_meta_box() 在它可用之前,您应该能够看到Fatal Error 在PHP日志中,因为调用了未定义的函数。

要进行故障排除,我首先确认register_meta_box_cb 只需让它调用一个函数die; 或者将某物写入文件。

确认其正常工作后,可以尝试使用register_meta_box_cb 调用将向添加操作的函数add_meta_boxes. 有回拨权add_meta_boxes 操作运行您的add_meta_box()

如果这不起作用或者你需要更多的帮助,请告诉我!

SO网友:Omkar Totade

所以,我找到了问题所在。

这就像一个不正确的类变量名一样微不足道。我使用了一个变量field_label 在类中,并错误地访问它,如$this->label, 这意味着它有空值。

然而,我在post类型注册期间添加元框的方法非常有效。

相关推荐

Last post in loop when even

我使用这段代码尝试检查每个页面上的最后一篇文章循环是否均匀,以便添加不同的类。这可以检查它是否是最后一篇文章:( ( 1 == $wp_query->current_post + 1 ) == $wp_query->post_count ) 这可以检查它是否是一个均匀的帖子( $wp_query->current_post % 2 == 0 ) 但这并没有检查这是否是最后一篇文章,甚至。 ( ( 1 == $wp_query->current_post + 1