0

嗨,我正在尝试使用 wordpress register_activation_hook() 函数创建插件激活时不存在的表。

当我将代码放在插件主文件(我们在其中定义插件元)中时,代码运行良好,但是当我尝试在子目录中的其他文件中使用它时,它不起作用。我已尝试更改register_activation_hook(__FILE__, 'my_medias_db');register_activation_hook(to_plugin_root_path, 'my_medias_db');插件根路径,但仍然无法正常工作。任何想法?

这是代码

function my_medias_db() {
    require_once( ABSPATH . '/wp-admin/includes/upgrade.php' );
    global $wpdb;
    $db_table_name = $wpdb->prefix . 'my_medias';
    if( $wpdb->get_var( "SHOW TABLES LIKE '$db_table_name'" ) != $db_table_name ) {
        if ( ! empty( $wpdb->charset ) )
            $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
        if ( ! empty( $wpdb->collate ) )
            $charset_collate .= " COLLATE $wpdb->collate";

        $sql = "CREATE TABLE " . $db_table_name . " (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `post_id` int(11) NOT NULL,
            `image_name` text NOT NULL,
            `status` tinyint(1) DEFAULT NULL,
            PRIMARY KEY (`id`)
        ) $charset_collate;";
        dbDelta( $sql );
    }
}
register_activation_hook(__FILE__, 'my_medias_db');
4

1 回答 1

0

上面的代码在主插件索引文件中吗?

如果不是,那是你的问题。如果你看一下 wp 代码,activation_hook 调用依赖于 $file 参数作为插件索引文件,所以如果你从另一个文件调用 register_activation_hook 尝试这样的事情(这是一个 OO 示例)

……剪……

    $strPluginFilename = $this->getMainPluginFilename();
    // rcarver - the activation hook calls rely on the file name being the plugin index!
    register_activation_hook($strPluginFilename, array($this, 'baseActivate') );
    register_deactivation_hook($strPluginFilename, array($this, 'baseDeactivate') );

……剪……

protected function getMainPluginFilename() {
    // eg. /some/place/wp-content/plugins/my_cool_plugin/pluginbase.php will
    // result in the base file name of  "my_cool_plugin.php"
    // NOTE: THIS ONLY WORKS IF THE CURRENT FILE IS IN THE SAME DIRECTORY
    //       AS THE MAIN PLUGIN FILE!
    return dirname(__FILE__) . '/' . basename(dirname(__FILE__)) . '.php';
}

……剪……

于 2013-10-30T14:48:34.297 回答