J'enseigne moi-même les espaces de noms et OOP in wordpress au moment où je suis nue.
Dans la base de mon plugin, je charge des crochets d'activation et de désactivation. Actuellement, le hook de désactivation fonctionne, mais pas le hook d'activation, il échoue simplement (WP_DEBUG
est activé).
Le fichier de base déclare un espace de noms et une constante, puis requiert les fichiers de classe pour l'activation et la désactivation, puis enregistre les points d'ancrage. L'activation et la désactivation sont fonctionnellement identiques, chacune nécessitant et instanciant une classe de consignation des erreurs et envoyant un message à une méthode.
J'ai jeté sur la documentation à la fois pour register_deactivation_hook
et pour register_activation_hook
(en particulier les notes du contributeur) et je n'ai pas été en mesure de résoudre ce problème. l'autre ne sera pas grandement apprécié.
La structure du fichier est la suivante:
/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 );
}
}
}
}
La raison pour laquelle le hook d'activation de plugin ne fonctionnait pas dans le code fourni dans la question est que, lors de l'activation du plugin, le hook plugins_loaded
n'est jamais exécuté. Le hook register_activation_hook
ayant été raccordé à partir de plugins_loaded
, il n'a jamais été exécuté lors de l'activation. Et comme il n’est jamais renvoyé, cette méthode d’accrochage permet à register_activation_hook
de ne jamais se déclencher.
La solution consiste à enregistrer le hook d'activation à partir du fichier de plugin principal et non attaché à aucun hook. En fait, c’est le seul moyen d’exécuter le hook d’activation. Après l’activation d’un plug-in, seuls deux autres hooks sont exécutés: le hook d’activation du plug-in en question et shutdown
. Il est possible d'ajouter des hooks à shutdown
et ils se déclencheront lors de l'activation du plugin, mais ils se déclencheront après le hook d'activation du plugin.
/**
* 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' ] );
Le crochet d'activation appelle ensuite la méthode statique activate à partir de la classe StackExchange\WordPress\ActivatorClass.
Remarques:
__DIR__
nécessitent PHP> 5.3