我无法在插件激活时创建两个表。
这是我迄今为止尝试过的。
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();
}
该文件位于表格目录下,不确定为什么在插件激活时没有创建表格。我在这里错过了什么吗? 请帮忙。谢谢和亲切的问候
虽然我不确定,但我可以说以下几点。
__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 需要主插件文件的路径。不是任何子文件夹中的文件路径。