插件激活时无法在 WordPress 中创建表

问题描述 投票:0回答:1

我无法在插件激活时创建两个表。

这是我迄今为止尝试过的。

function bohio_table() {
   
      global $wpdb;
      $wpdb->hide_errors();
      // Require upgrade
      // Set charset
      $collate = '';
      if ( $wpdb->has_cap( 'collation' ) ) {
         $collate = $wpdb->get_charset_collate();
      }

      $bohio = $wpdb->prefix . 'bohio';
      $cadence = $wpdb->prefix . 'cadence';

      require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
      $queries = array();
      // bohio table
      array_push($queries, "CREATE TABLE `{$bohio}` (
         primary_key mediumint(11) NOT NULL AUTO_INCREMENT,
         square_feet varchar(80) NOT NULL,
         bed varchar(80) NOT NULL,
         bath varchar(80) NOT NULL,
         bh_service varchar(80) NOT NULL,
         price varchar(80) NOT NULL,
         PRIMARY KEY (primary_key)
         ) {$collate}");
      // cadence table
      array_push($queries, "CREATE TABLE `{$cadence}` (
         id int(11) NOT NULL AUTO_INCREMENT,
         fk varchar(80) NOT NULL,
         cadence varchar(80) NOT NULL,
         price varchar(80) NOT NULL,
         PRIMARY KEY (id)
         ) {$collate}");
      
      foreach ($queries as $key => $sql) {
         dbDelta( $sql );
      }
 }
register_activation_hook( __FILE__, 'bohio_table' );

我不知道我哪里做错了?

在我的插件的主文件中将其称为

if( !defined('ABSPATH') ) {
   die('You cannot be here');
}
if( !class_exists('BohioClean') ) {
  class BohioClean{
        public function __construct() {
            define('MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ));
            define('MY_PLUGIN_URL', plugin_dir_url( __FILE__ ));
        }
        public function initialize() {
            // Load tables on the fly  
            include_once MY_PLUGIN_PATH . 'tables/bohio_table.php';
        }
  }
  $BohioClean = new BohioClean;
  $BohioClean->initialize();
}

该文件位于表格目录下,不确定为什么在插件激活时没有创建表格。我在这里错过了什么吗? 请帮忙。谢谢和亲切的问候

php sql wordpress plugins wordpress-plugin-creation
1个回答
1
投票

虽然我不确定,但我可以说以下几点。

__FILE__
在激活期间可能无法工作,因为它驻留在不同的文件中。

https://developer.wordpress.org/reference/functions/register_activation_hook/

第一个参数应采用插件文件的路径。您正在传递表文件夹的路径。我建议在主插件文件中的任何类或函数之外定义您的钩子。该挂钩应该在插件激活之前起作用。如果您仍想在类中定义它,请传递主文件中的路径或进行自己的编辑以创建路径。我不建议直接手动创建它。

最好这样做:

if( !defined('ABSPATH') ) {
   die('You cannot be here');
}
if( !class_exists('BohioClean') ) {
  class BohioClean{
        public function __construct() {
            define('MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ));
            define('MY_PLUGIN_URL', plugin_dir_url( __FILE__ ));
        }
        public function initialize() {
            // Load tables on the fly  
            include_once MY_PLUGIN_PATH . 'tables/bohio_table.php';
        }
  }
  $BohioClean = new BohioClean;
  $BohioClean->initialize();
  register_activation_hook( __FILE__, 'bohio_table' );
}

if( !defined('ABSPATH') ) {
    die('You cannot be here');
}
if( !class_exists('BohioClean') ) {
    class BohioClean{
        public function __construct() {
            define('MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ));
            define('MY_PLUGIN_URL', plugin_dir_url( __FILE__ ));
        }

        public static function initialize() {
            include_once MY_PLUGIN_PATH . 'tables/bohio_table.php';
            bohio_table();
        }
    }
    $BohioClean = new BohioClean;

    register_activation_hook( __FILE__, 'BohioClean::initialize' );
}


...
register_activation_hook( MY_PLUGIN_FILE, 'bohio_table' );

if( !defined('ABSPATH') ) {
    die('You cannot be here');
}
if( !class_exists('BohioClean') ) {
    class BohioClean{
        public function __construct() {
            define('MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ));
            define('MY_PLUGIN_URL', plugin_dir_url( __FILE__ ));
            define('MY_PLUGIN_FILE', __FILE__);
        }
        public function initialize() {
            // Load tables on the fly  
            include_once MY_PLUGIN_PATH . 'tables/bohio_table.php';
        }
    }
    $BohioClean = new BohioClean;
    $BohioClean->initialize();
}

我认为任何人都应该解决他们的问题。你应该一开始就设置好插件结构。

//编辑

这是因为,正如我所提到的,

__FILE__
变量指定了它所在文件的路径。您可以在子文件夹中的文件中调用它并像这样运行挂钩。您需要做的是将主插件文件的路径添加到挂钩函数。它将正常工作,因为主文件中的
__FILE__
变量将指向主插件文件的路径。

以下是一个例子,让您更好地理解:

In bohio_table.php file:
__FILE__ : .../wp-content/plugins/my-plugin/tables/bohio_table.php

In my-plugin.php file:
__FILE__: .../wp-content/plugins/my-plugin/my-plugin.php

register_activation_hook 需要主插件文件的路径。不是任何子文件夹中的文件路径。

© www.soinside.com 2019 - 2024. All rights reserved.