#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 файл. Я неправильно использую автоматическую загрузку?