WordPress/PHP — Пространства имен/Загрузчик — Фатальная ошибка: Ошибка типа: Ошибка call_user_func_array(): Аргумент #1 ($функция) должен быть допустимым обратным вызовом

#php #wordpress #composer-php #autoload

Вопрос:

Я создаю свой первый плагин полностью с нуля. Всякий раз, когда я пытаюсь добавить пространство имен в ‘template-plugin-activate.php» файл, я получаю следующую ошибку:

 Plugin could not be activated because it triggered a fatal error.
Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($function) must be a valid callback, class "TemplatePluginActivate" not found in C:xampphtdocswordpresswp-includesclass-wp-hook.php:292 Stack trace: #0 C:xampphtdocswordpresswp-includesclass-wp-hook.php(316): WP_Hook->apply_filters('', Array) #1 C:xampphtdocswordpresswp-includesplugin.php(484): WP_Hook->do_action(Array) #2 C:xampphtdocswordpresswp-adminplugins.php(193): do_action('activate_templa...') #3 {main} thrown in C:xampphtdocswordpresswp-includesclass-wp-hook.php on line 292
 

Ниже приведены мои файлы. Любая помощь будет признательна.

// inc/template-plugin.php

 <?php

namespace Inc;

class TemplatePluginActivate
{
   public static function activate() {
      flush_rewrite_rules();
   }
}
 

// template-plugin.php

 defined( 'ABSPATH' ) or die( 'You cant access this file.' );

if ( file_exists( dirname( __FILE__ ) . '/vendor/autoload.php' ) ) {
    require_once dirname( __FILE__ ) . '/vendor/autoload.php';
}

use IncTemplatePluginActivate;

if ( !class_exists( 'TemplatePlugin' ) ) {

    class TemplatePlugin
    {
        //
    }
}

require_once plugin_dir_path( __FILE__ ) . 'inc/template-plugin-activate.php';
register_activation_hook( __FILE__, array( 'TemplatePluginActivate', 'activate' ) );

require_once plugin_dir_path( __FILE__ ) . 'inc/template-plugin-deactivate.php';
register_activation_hook( __FILE__, array( 'TemplatePluginDeactivate', 'deactivate' ) );
 

// composer.json

 {
    "name": "author/template-plugin",
    "description": "awesome starter plugin example",
    "type": "project",
    "license": "GPL",
    "authors": [
        {
            "name": "author",
            "email": ""
        }
    ],
    "minimum-stability": "dev",
    "require": {},
    "autoload": {
        "psr-4": {"Inc\": "./inc"}
    }
}
 

Комментарии:

1. Пожалуйста, поделитесь более подробной информацией, например, кодом, вызывающим эту проблему. Кроме того, пожалуйста, объясните, как это связано с композитором

2. Цель состоит в том, чтобы настроить мои файлы так, чтобы я мог позже использовать загрузку из Composer. НО, прежде чем я сделаю что-либо из этого, я должен настроить template-plugin.php подай так, как я хочу. Я хочу удалить «require_once» из template-plugin.php файл, а вместо этого используйте » использовать IncTemplatePluginActivate;» вместо этого. К счастью, изменив учетную запись register_activation_hook, я теперь могу использовать ‘namespace Inc;’ из ‘template-plugin-activate.php — файл. НО я все еще не могу заставить » использовать IncTemplatePluginActivate;» работать. Я все еще получаю ту же ошибку.

3. Ладно, думаю, я все понял. Мне пришлось изменить файл ‘template-plugin-activate’ на имя в верхнем регистре, чтобы его можно было прочитать как правильное пространство имен. То же самое касается деактивации. ТЕПЕРЬ » использовать IncАктивировать;» работает.

4. Пожалуйста, добавьте все пояснения к вашему вопросу, отредактировав его

Ответ №1:

Проблема в register_activation_hook() том, что .

Ваш обратный вызов-это activate() метод TemplatePluginActivate класса. Это необходимо обновить, как только вы введете пространства имен. Класс был бы таким IncTemplatePluginActivate .

 register_activation_hook( __FILE__, array( 'IncTemplatePluginActivate', 'activate' ) );
 

Кроме того, ваше действие деактивировать также выполняется при активации. Крючок, который вам нужен, это register_deactivation_hook() .

Комментарии:

1. Спасибо за помощь. Я все еще не могу использовать: используйте IncTemplatePluginActivate, в template-plugin.php файл. Я неправильно использую автоматическую загрузку?