我正在用oop编写一个简单的插件,并使用名称空间和自动加载。这是我的主要文件:
add_action(\'plugins_loaded\', array(My_Test_Plugin::get_instance(), \'plugin_setup\'));
class My_Test_Plugin
{
/**
* Plugin instance.
*
* @see get_instance()
* @type object
*/
protected static $instance = NULL;
/**
* URL to this plugin\'s directory.
*
* @type string
*/
public $plugin_url = \'\';
/**
* Path to this plugin\'s directory.
*
* @type string
*/
public $plugin_path = \'\';
/**
* Access this plugin’s working instance
*
* @wp-hook plugins_loaded
* @since 2012.09.13
* @return object of this class
*/
public static function get_instance()
{
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
/**
* Used for regular plugin work.
*
* @wp-hook plugins_loaded
* @return void
*/
public function plugin_setup()
{
$this->plugin_url = plugins_url(\'/\', __FILE__);
$this->plugin_path = plugin_dir_path(__FILE__);
$this->load_language(\'vt-plugin\');
spl_autoload_register(array($this, \'autoload\'));
}
/**
* @param $class
*
*/
public function autoload($class)
{
$class = str_replace(\'\\\\\', DIRECTORY_SEPARATOR, $class);
if (!class_exists($class)) {
$class_full_path = $this->plugin_path . \'includes/\' . $class . \'.php\';
if (file_exists($class_full_path)) {
require $class_full_path;
}
}
}
}
在中
includes/PostTypes
目录中有一个名为
Book.php
它包含以下内容:
namespace Book;
class Book {
public function vt_create_book_post_type() {
$labels = array(
\'name\' => _x( \'Books\', \'vt-plugin\' ),
\'singular_name\' => _x( \'Book\', \'vt-plugin\' ),
\'menu_name\' => _x( \'Books\', \'vt-plugin\' ),
),
);
register_post_type( \'book\', $args );
}
}
它只注册一个简单的post类型。现在我的问题是我应该在哪里使用
init
注册帖子类型的操作?
我在plugin_setup
我的主文件中的函数:
add_action( \'init\', array(\'Book\', \'vt_register_book_post_type\') );
但它给了我一个错误:
Warning: call_user_func_array() expects parameter 1 to be a valid callback
Update如果我将自动加载器功能更改为:
public function autoload($class)
{
$class = str_replace(\'\\\\\', DIRECTORY_SEPARATOR, $class);
if (!class_exists($class)) {
$class_full_path = $this->plugin_path . \'includes/\' . $class . \'.php\';
if (file_exists($class_full_path)) {
require $class_full_path;
echo $class_full_path;
}
}
}
并在if语句中回显完整路径,它不会回显任何内容,我认为这意味着不包括文件。
SO网友:Nathan Johnson
回调[ \'Book\', \'vt_register_book_post_type\' ]
正在向静态方法添加挂钩vt_register_book_post_type
在Book
全局命名空间的类。
如果要向Book命名空间的静态类添加回调,则需要使用[ \'\\Book\\Book\\\', \'vt_register_book_post_type\' ]
作为回调,但这也会导致警告或错误,因为您的方法不是静态的。您可以声明您的方法static
, 但我认为你想做的是这样的:
namespace Book;
class book {
public function vt_create_book_post_type() {
$labels = [
\'name\' => _x( \'Books\', \'vt-plugin\' ),
\'singular_name\' => _x( \'Book\', \'vt-plugin\' ),
\'menu_name\' => _x( \'Books\', \'vt-plugin\' ),
];
register_post_type( \'book\', $args );
}
}
$book = new book();
\\add_action( \'init\', [ $book, \'vt_create_book_post_type\' ] );
你的自动装弹机没有问题。或者至少这不是导致错误的原因。