Вопрос: Проблема с автозагрузчиком и пространствами имен

Я пишу простой плагин с 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;            }        }    }}

В каталоге включает в себя /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 );    }}

Он просто регистрирует простой тип записи. Теперь мой вопрос: где я должен использовать свое действие 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 

Обновление . Если я изменю свою функцию автозагрузчика следующим образом:

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, он ничего не отобразит, и я думаю, это означает, что файлы не являются включен.

<

Ответы и комментарии:

Я исправил свой код на основе вашего ответа, но он все равно не создает тип записи. А также нет ошибок или предупреждений.
Создан 24-10-2018 06:52 Amirition

$ book = new book (); и add_action () должен находиться в файле, который уже был включен. Мне трудно представить, как это может не зарегистрировать тип сообщения и не вызвать какую-либо ошибку.
Создан 24-10-2018 03:04 Nathan Johnson

Я обновил вопрос, добавив дополнительную информацию о функции автозагрузчика. Я все еще думаю, что что-то не так с этим.
Создан 24-10-2018 05:31 Amirition

Автозагрузчик работает вообще? Что за класс? Что такое $ class_full_path?
Создан 24-10-2018 07:54 Nathan Johnson

Обратный вызов ['Book', 'vt_register_book_post_type'] добавляет хук к статическому методу vt_register_book_post_type в классе Book глобального пространства имен.
Если вы хотите добавить обратный вызов в статический класс пространства имен Book, вам нужно использовать [' Book Book ', 'vt_register_book_post_type'] в качестве обратного вызова, но это также вызовет предупреждение или ошибку, так как ваш метод не статично. Вы можете объявить ваш метод статическим, но я думаю, что вы хотите сделать что-то вроде этого:
Книга пространства имен;
учебник {
  публичная функция vt_create_book_post_type () {
    $ метки = [
      'name' => _x ('Books', 'vt-plugin'),
      'singular_name' => _x ('Book', 'vt-plugin'),
      'menu_name' => _x ('Книги', 'vt-plugin'),
    ];
    register_post_type ('book', $ args);
  }
}
$ book = new book ();
add_action ('init', [$ book, 'vt_create_book_post_type']);

Нет ничего плохого в вашем автозагрузчике. Или, по крайней мере, это не то, что вызывает ошибку.
Создан 23-10-2018 11:54 Nathan Johnson4,97841236