ПРОСТРАНСТВО ИМЕН с крючком активации регистра


В данный момент я учусь пространствам имен и ООП в 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 );
            }
        }
    }
 }
Author: orionrush, 2016-05-08

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.

Примечания:

  1. Для строгого набора текста требуется PHP >7.0.
  2. Стенография массива требуется PHP >5.4
  3. Пространство имен и __DIR__ требуют PHP>5.3
 5
Author: Nathan Johnson, 2018-04-03 22:43:56