web-dev-qa-db-ja.com

register_activation_hook付きの__NAMESPACE__

私は自分自身の名前空間とOOPをワードプレスで教えています。

私のプラグインのベースにはアクティベーションフックとデアクティベーションフックがあります。現在、アクティベーションフックは機能しますが、アクティベーションフックは機能しません。単に黙って失敗します(WP_DEBUGがオン)。

ベースファイルは名前空間と定数を宣言してから、アクティブ化と非アクティブ化のためにクラスファイルを要求してからフックを登録します。アクティブ化と非アクティブ化は、エラーロギングクラスを要求してインスタンス化し、メッセージをメソッドに送信することと機能的に同じです。

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

質問で提供されているコードでプラグインアクティベーションフックが機能していなかったのは、プラグインアクティベーション時に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を呼び出します。

ノート:

  1. 厳密な型指定にはPHP> 7.0が必要です。
  2. 配列の省略形にはPHP> 5.4が必要です
  3. 名前空間と__DIR__はPHP> 5.3が必要です
5
Nathan Johnson