ПРОСТРАНСТВО ИМЕН с крючком активации регистра
В данный момент я учусь пространствам имен и ООП в wordpress, так что со мной все в порядке.
В базе моего плагина я загружаю крючки активации и деактивации. В настоящее время крючок деактивации работает, но крючок активации не работает, он просто молча выходит из строя (WP_DEBUG
включен).
Базовый файл объявляет пространство имен и константу, а затем требует файлы классов для активации и деактивации, а затем регистрирует крючки. Активация и деактивация являются функционально идентичен каждому, требующему и создающему экземпляр класса регистрации ошибок и отправляющему сообщение методу.
Я просмотрел документацию для обоих register_deactivation_hook
и для register_activation_hook
( особенно примечания автора), и я не смог решить эту проблему, поэтому любые мысли о том, почему одно работает, а другое нет, будут высоко оценены.
Структура файла выглядит следующим образом следует:
/plugin/
plugin.php
/plugin/includes/
ActivatorClass.php
DeactivatorClass.php
ErrorLogClass.php
/plugin/plugin.php
<?php
namespace company\pluginName;
/**
* Plugin Name: Plugin Name
* Plugin URI: http://url
* Description: A demo plugin
* Version: 0.0.1
* Author: me
*/
function pluginInit() {
// Machine file path
define( 'PLUGIN_PATH', realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR );
/**
* Runs during plugin activation.
* Documented in includes/ActivatorClass.php
*/
require_once PLUGIN_PATH . 'includes/ActivatorClass.php';
register_activation_hook( __FILE__, array( __NAMESPACE__ . '\\ActivatorClass', 'activate' ) );
/**
* Runs during plugin deactivation.
* Documented in includes/DeactivatorClass.php
*/
require_once PLUGIN_PATH . 'includes/DeactivatorClass.php';
register_deactivation_hook( __FILE__, array( __NAMESPACE__ . '\\DeactivatorClass', 'deactivate' ) );
}
add_action( 'plugins_loaded', __NAMESPACE__ . '\\pluginInit' );
Plugin/includes/ActivatorClass.php
<?php
namespace company\pluginName;
/**
* Fired during plugin activation
*
* This class defines all code necessary to run during the plugin's activation.
*
* @since 0.0.1
* @package plugin\pluginName\
* @author me
*/
class ActivatorClass {
/**
* Fired during plugin activation
*
* @since 0.0.1
*/
public static function activate() {
require ( PLUGIN_PATH. '/includes/ErrorLogClass.php');
$activate = new ErrorLog();
$activate->log('Plugin Activated');
}
}
/plugin/includes/ErrorLogClass.php
<?php
namespace company\pluginName;
/**
* Class ErrorLog
*
* @since 0.0.1
* @package plugin\pluginName\
* @author me
*/
class ErrorLog {
/**
* The error(s) to be logged
* @var array | string
*/
protected $log;
/**
* The logging method
*
* @param $log
*/
public static function log( $log ) {
if ( true === WP_DEBUG ) {
if ( is_array( $log ) || is_object( $log ) ) {
error_log( print_r( $log, true ) );
} else {
error_log( $log );
}
}
}
}
1 answers
Причина, по которой крючок активации плагина не работал в коде, приведенном в вопросе, заключается в том, что при активации плагина крючок plugins_loaded
никогда не запускается. Поскольку крючок register_activation_hook
был подключен из plugins_loaded
, он никогда не запускался при активации. И поскольку он больше никогда не стрелял, этот способ зацепления приводит к тому, что register_activation_hook
никогда не стреляет.
Решение состоит в том, чтобы зарегистрировать крючок активации из основного файла плагина и не прикреплять его ни к каким крючкам. На самом деле, это единственный способ, которым вы можете запустить крючок активации. После активации плагина запускаются только два других крючка: этот конкретный крючок активации плагина и shutdown
. Можно добавить крючки в shutdown
, и они будут срабатывать при активации плагина, но он срабатывает после крючка активации плагина.
/**
* Plugin Name: WordPress Namespace OOP Plugin Example
*/
declare( strict_types = 1 );
namespace StackExchange\WordPress;
//* Start bootstraping the plugin
require( __DIR__ . '/includes/plugin.php' );
$WordPressStackExchangePlugin = new plugin();
\add_action( 'plugins_loaded', [ $WordPressStackExchangePlugin, 'plugins_loaded' ] );
//* Register activation hook
\register_activation_hook( __FILE__, [ __NAMESPACE__ . '\\ActivatorClass', 'activate' ] );
Затем крючок активации вызовет статический метод activate из класса StackExchange\WordPress\activatorclass.
Примечания:
- Для строгого набора текста требуется PHP >7.0.
- Стенография массива требуется PHP >5.4
- Пространство имен и
__DIR__
требуют PHP>5.3