私は自分自身の名前空間とOOPをワードプレスで教えています。
私のプラグインのベースにはアクティベーションフックとデアクティベーションフックがあります。現在、アクティベーションフックは機能しますが、アクティベーションフックは機能しません。単に黙って失敗します(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' );
プラグイン/インクルード/ 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 );
}
}
}
}
質問で提供されているコードでプラグインアクティベーションフックが機能していなかったのは、プラグインアクティベーション時にplugins_loaded
フックが実行されないためです。 register_activation_hook
フックはplugins_loaded
からフックされたので、起動時に決して実行されませんでした。これは二度と起動されないので、このフック方法ではregister_activation_hook
が起動されることはありません。
解決策は、メインプラグインファイルからアクティベーションフックを登録し、どのフックにもアタッチしないことです。実際、これがアクティベーションフックを実行できる唯一の方法です。プラグインがアクティブ化された後に実行されるフックは他に2つだけあります。それはその特定のプラグインアクティベーションフックと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' ] );
アクティベーションフックは、StackExchange\WordPress\ActivatorClassクラスから静的メソッドactivateを呼び出します。
ノート:
__DIR__
はPHP> 5.3が必要です