单例插件激活;创建数据库

时间:2016-12-13 作者:Pierre Smith

在我的singleton中,我有以下函数

class plugin {

  private static $_instance;

  private function __construct() {
    //does all add_actions & filters
    $this->_register_hooks();
  }


  public static function getInstance() {
    if ( ! ( self::$_instance instanceof self ) ) {
        self::$_instance = new self();
    }

    return self::$_instance;
  }

  static function create_order_table() {
    global $wpdb;

      $table_name = $wpdb->prefix . "order";
      $charset_collate = $wpdb->get_charset_collate();

      $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        name varchar(200) NOT NULL,
        description int(11) NOT NULL,
        alt_text int(11) NOT NULL,
        sort_order int(11) NOT NULL,
        time datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
        PRIMARY KEY  (id)
      ) $charset_collate;";

      require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
      dbDelta( $sql );

      add_option( \'db_version\', DB_VERSION );
  }


 /**
  * ATIVATION
  * on activation the plugin creates databases
  * @access public
  * @since 1.0
  */
  public function activate() {

        // DATABASE
        //creates table
    register_activation_hook( __FILE__, array( &$this, \'create_order_table\' ) );
  }
}
在我开始上课后,我会这样做:

global $plugin;

if ( ! $plugin ) {
  $plugin = plugin::getInstance();
  $plugin->activate();
}
但什么都没发生,为什么不花点时间呢?

非常感谢您的帮助。

1 个回复
SO网友:CodeMascot

这里有一个错误。您尚未声明_register_hooks() 方法我实例化了这个类,如下所示-

global $p;

if(empty($p)){
    $p = plugin::getInstance();
    $p->activate();
}
它成功了。因为WordPress使用了一个名为$plugin 在其生命周期中。你的代码会检查它是否为空。显然它不会是空的。所以你的$plugin = plugin::getInstance(); 从未执行。要使用此单例模式,最好声明变量$plugin 使用不同的名称。就像我宣布的那样$p 在这里最好用一些独特的东西作为前缀。希望这个建议对你有帮助。