web-dev-qa-db-fra.com

__NAMESPACE__ avec register_activation_hook

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 );
            }
        }
    }
 }
5
orionrush

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:

  1. Un typage strict nécessite PHP> 7.0.
  2. Le raccourci de tableau nécessite PHP> 5.4
  3. L'espace de nommage et __DIR__ nécessitent PHP> 5.3
5
Nathan Johnson