如何在主题文件夹中访问自定义类中的某些WP函数

时间:2017-04-12 作者:NoviQ

我正在构建一个自定义主题,我想创建一个助手类来处理管理面板中元盒的创建。我的类声明如下:

namespace ci\\wp;

Metaboxes::init();

class Metaboxes {

    private static $instance;
    private static $post;

    private static $metaboxesPath = TEMPLATEPATH . "/config/metaboxes/";

    static function init() {
        global $post;
        self::$post = &$post;
        add_action( \'add_meta_boxes\', [ __CLASS__, \'addMetabox\' ], 10, 5 );
    }

    // ADD METABOX
    static function addMetabox($id, $title, $post_type, $position, $priority) {
        if (file_exists(self::$metaboxesPath.$id.\'.php\')) {
            require_once(self::$metaboxesPath.$id.\'.php\');
            add_meta_box($id, $title, \'do_\'.$id, $post_type, $position, $priority);
        }
    }

[...]
问题是,当我想使用addMetabox方法时,通过编写\\ci\\wp\\Metaboxes::addMetabox(\'front_page_slide_settings\', \'Slide settings\', \'page\', \'normal\', \'high\'); 我得到以下错误:

Fatal error: Uncaught Error: Call to undefined function ci\\wp\\add_meta_box() in [...]

我尝试了几种在类中使用add\\u操作的不同方法,但无论是静态类、实例化时运行add\\u操作的单例类还是构造函数中运行add\\u操作的普通类,都会导致上述错误。

有没有办法让它发挥作用?我做错了什么?

2 个回复
SO网友:birgire

你实际上是在打电话给add_meta_box() 函数定义之前,直接运行时:

\\ci\\wp\\Metaboxes::addMetabox(
    \'front_page_slide_settings\', 
    \'Slide settings\', 
    \'page\', 
    \'normal\', 
    \'high\'
);
你没有提到你在哪里运行它,但太早了,或者你在前端运行它,在哪里add_meta_box() 未定义。

这个add_meta_box() 函数在此文件中定义:

/** WordPress Template Administration API */
require_once(ABSPATH . \'wp-admin/includes/template.php\');
确保在之后运行有问题的代码段,例如在add_meta_boxes 行动,就像你在Metaboxes::init() 呼叫

核心init 例如,操作在加载模板管理API之前激发。

SO网友:NoviQ

谢谢你的帮助。我知道我错过了什么。

我只是忘了将所有呼叫打包到addMetabox 连接到的函数中的静态方法admin_init. 在我做了那件事之后,一切都如期进行。我甚至不需要add_meta_boxes 在Metaboxes类中。

更新:在花了一些时间研究如何快速制作其他东西,如保存新的帖子元之后,结果证明,尝试使用这样的方法来简化这些事情实际上会使它们更加复杂。在admin\\u init hook上添加元盒使得无法检查已编辑的post ID,因为此时post var没有数据。吸取的教训。

相关推荐

Too many actions/filters!

这里是wordpress的新成员。动作/过滤器的概念本身并不难理解。令我不知所措的是大量可用的操作和过滤器。当我阅读教程/指南时,他们会说“只需将此功能添加到wp\\U head操作或after\\U setup\\u主题”。如果没有这些教程,我究竟如何知道将该函数与该操作挂钩?作为一个初学者,我怎么会知道什么是合适的操作?有没有关于如何导航的建议?谢谢