Call_user_func_array(): аргумент №1 ($callback) должен быть допустимым обратным вызовом

В настоящее время я разрабатываю плагин WordPress. Созданный мною основной класс активирует и деактивирует все необходимые функции, настройки и файлы для плагина, а для управления включением классов я использую композитор.

Вчера я изменил основную папку psr-4 с src/ на admin/builder/, и это вызвало проблемы.
Теперь иерархия проекта такая:

onfeed-facebook\
|---admin\
    |---builder
        |---Action\
        |---RSA\
        |---View\
        |---OnFeedMain.php
|---vendor\
|---assets\
|---onfeed.php
|---...

Должен отметить, что после редактирования файла composer.json я также выполнил команду composer dump-autoload... но все равно получаю эту ошибку:

Fatal error: Uncaught TypeError: call_user_func_array(): Argument #1 ($callback) must be a valid callback, first array member is not a valid class name or object in C:\www\clientwp.local\wp-includes\class-wp-hook.php:310 
Stack trace: 
#0 C:\www\clientwp.local\wp-includes\class-wp-hook.php(334): WP_Hook->apply_filters('', Array) 
#1 C:\www\clientwp.local\wp-includes\plugin.php(517): WP_Hook->do_action(Array) 
#2 C:\www\clientwp.local\wp-admin\includes\plugin.php(816): do_action('deactivate_onfe...', false) 
#3 C:\www\clientwp.local\wp-admin\plugins.php(209): deactivate_plugins('onfeed-facebook...', false, false) 
#4 {main} thrown in C:\www\clientwp.local\wp-includes\class-wp-hook.php on line 310

Вот файл composer.json:

    "autoload": {
        "psr-4": {
            "Oppimittinetworking\\OnfeedFacebook\\": "admin/builder/"
        }
    },
    "config": {
        "optimize-autoloader": true
    }

Это OnFeedMain.php Класс:

namespace Oppimittinetworking\OnfeedFacebook;
use Oppimittinetworking\OnfeedFacebook\Action\ONFActivate;
use Oppimittinetworking\OnfeedFacebook\Action\ONFDeactivate;
use Oppimittinetworking\OnfeedFacebook\RSA\ONFRSAEncrypt;
use Oppimittinetworking\OnfeedFacebook\RSA\ONFRSADecrypt;

class OnFeedMain {

    public function __construct() {
        ONFActivate::activate();
        ONFActivate::register_admin_scripts();
        ONFActivate::register_wp_scripts();
    }

    public function __deactivate() {
        ONFDeactivate::deactivate();
        ONFDeactivate::unregister_admin_scripts();
        ONFDeactivate::unregister_wp_scripts();
    }

    public static function encrypt_conn() { return new ONFRSAEncrypt(); }
    public function decrypt_data() { return new ONFRSADecrypt(); }
}

Вот файл onfeed.php:

require_once ONFEED_PLUGIN_PATH . '/vendor/autoload.php';
use Oppimittinetworking\OnfeedFacebook\OnFeedMain;

if ( class_exists( 'OnFeedMain' ) )
    $onfmain = new OnFeedMain();

// activaion hook
register_activation_hook( __FILE__, array( $onfmain, '__construct' ) );

// deactivation hook
register_deactivation_hook( __FILE__, array( $onfmain, '__deactivate' ) );

Вот функции внутри классов ONFActivate.php и ONFDeactivate.php:
ONFActivate.php:

namespace Oppimittinetworking\OnfeedFacebook\Action;

class ONFActivate {

    public static function activate() {
        // No relevant code ...
    }

    public static function register_admin_scripts() {
        add_action( 'admin_enqueue_scripts', array( 'Oppimittinetworking\OnfeedFacebook\Action\ONFActivate', "enqueue_admin" ) );

        add_action( 'admin_menu', array( "Oppimittinetworking\OnfeedFacebook\Action\ONFActivate", 'add_admin_pages' ) );
    }

    public static function add_admin_pages() {
        add_menu_page( 'OnFeed Facebook', 'OnFeed Facebook', 'manage_options', 'onfeed_admin_menu', array( 'Oppimittinetworking\OnfeedFacebook\Action\ONFActivate', 'admin_index' ), 'dashicons-facebook-alt', 110 );
    }

    public static function admin_index() {
        require_once plugin_dir_path( __FILE__ ) . '../../admin/builder/index.php';
    }

    public static function register_wp_scripts() {
        // TODO
    }

    public static function enqueue_admin() {
        // Enqueue admin css files
        // [email protected]
        wp_register_style( "bootstrap", "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" );
        wp_enqueue_style( "bootstrap" );

        // [email protected]
        wp_register_style( "font_awesome", "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" );
        wp_enqueue_style( "font_awesome" );

        wp_enqueue_style( "onfeed_main_css", plugins_url( "../../assets/css/main.css", __FILE__ ) );
        wp_enqueue_style( "onfeed_shortcut_css", plugins_url( "../../assets/css/shortcut.css", __FILE__ ) );
        wp_enqueue_style( "onfeed_feedspage_css", plugins_url( "../../assets/css/feedspage.css", __FILE__ ) );
        
        // Enqueue admin js files
        // [email protected]
        wp_enqueue_script( "jquery_3_7_1-min", plugins_url( "../../assets/js/jquery-3.7.1.min.js", __FILE__ ), null, '3.7.1', array( 'strategy' => 'async' ) );

        wp_enqueue_script( "onfeed_function_js", plugins_url( "../../assets/js/function.js", __FILE__ ), null, '2.2.0', array( 'strategy' => 'defer' ) );
        wp_enqueue_script( "onfeed_handshake_js", plugins_url( "../../assets/js/handshake.js", __FILE__ ), null, '2.2.0', array( 'strategy' => 'defer' ) );
        wp_enqueue_script( "onfeed_shortcut_js", plugins_url( "../../assets/js/shortcut.js", __FILE__ ), null, '2.2.0', array( 'strategy' => 'defer' ) );
        wp_enqueue_script( "onfeed_feedspage_js", plugins_url( "../../assets/js/feedspage.js", __FILE__ ), null, '2.2.0', array( 'strategy' => 'defer' ) );
    }

    public static function enqueue_wp() {
        // TODO
    }
}

ONFDeactivate.php:

namespace Oppimittinetworking\OnfeedFacebook\Action;

class ONFDeactivate {

    public static function deactivate() {
        // Not relevant code ...
    }

    public static function unregister_admin_scripts() {
        add_action( 'admin_dequeue_scripts', array( 'Oppimittinetworking\OnfeedFacebook\Action\ONFDeactivate', "dequeue_admin" ) );
    }

    public static function unregister_wp_scripts() {
        // TODO
    }

    public static function dequeue_admin() {
        // Enqueue admin css files
        wp_dequeue_style( "onfeed_main_css" );
        wp_dequeue_style( "onfeed_shortcut_css" );
        wp_dequeue_style( "onfeed_feedspage_css" );

        // Enqueue admin js files
        wp_dequeue_script( "onfeed_main_js" );
        wp_dequeue_script( "onfeed_shortcut_js" );
        wp_dequeue_script( "onfeed_feedspage_js" );
    }

    public static function dequeue_wp() {
        // TODO
    }
}

Я также хотел бы сообщить вам, что я проверил, была ли проблема вызвана неправильным пространством имен, но как вы можете видеть, что с этим нет проблем.

Я также проверил эту ссылку:

но проблема все равно.

Заранее спасибо за ваш ответ.

@MarkusZeller К сожалению, нет, потому что он использует нестатические методы, тогда как мои — статические. Я считаю, что проблема вызвана register_activation_hook() и register_deactivation_hook(), но не могу понять, почему.

Andrew 22.09.2023 12:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему, обновив эту строку: If ( class_exists( 'OnFeedMain' ) ) внутри onfeed.php.
Я забыл вставить правильное пространство имен:

If ( class_exists( 'OnFeedMain' ) )
    $onfmain = new OnFeedMain();

К:

If ( class_exists( 'Oppimittinetworking\OnfeedFacebook\OnFeedMain') )
    $onfmain = new OnFeedMain();

Другие вопросы по теме