当前位置: 首页 > 知识库问答 >
问题:

插件激活时无法创建表

屠和洽
2023-03-14

我试图在插件激活时创建表,我尝试在类内创建相同的函数并从构造函数调用它,我尝试在类外调用它,最后我尝试创建另一个php文件来使用register_activation_hook调用它,但没有成功

插件代码:

<?php
/**
*@package pageauthors
**/

/** 
* Plugin Name: Page Authors
* Plugin URI: https://www.localhost.com/plugin
* Description: Allows you to add multiple authors to your wordpress post.
* Version: 1.0.0 
* Author: Raphael Eid.
* Author URI: https://www.localhost.com/
* License: GPL v2 or Later 
* Text Domain: PageAuthors
*/

$db = mysqli_connect('localhost','x','x','x');
//We can use require_once('../../../wp-config.php');
//mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);

defined('ABSPATH') or die('Error my friend');

class pageauthors{

    function register(){
        //Call the Scripts
        add_action('admin_enqueue_scripts', array($this, 'enqueue'));

        //Create in the admin function
        add_action('admin_menu', array($this, 'add_admin_pages'));
    }   
    
    public function add_admin_pages(){
        //add_menu_page( string $page_title, string $menu_title, string $capability, string $menu_slug, callable $function = '', string $icon_url = '', int $position = null )
        add_menu_page('Add Author', 'Add Author', 'manage_options', 'raphaelprefix_plugin', array($this, 'admin_index'), 'dashicons-insert', 110);
    }

    public function admin_index(){
        define( 'MY_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
        include( MY_PLUGIN_PATH . 'templates/index.php');
        // include( MY_PLUGIN_PATH . 'index.php');
        include( MY_PLUGIN_PATH . 'templates/showAuthors.php');
        // require_once plugin_dir_path(__FILE__) . 'templates/index.php';
    }    

    function deactivate(){
        global $wpdb;
        $table_name = $wpdb->prefix . 'postsauthors';
        $sql = "DROP TABLE IF EXISTS $table_name";
        $wpdb->query($sql);
        delete_option("my_plugin_db_version");
    }

    function enqueue(){
        //Here we can enqueue and we should create the assets (css and js)
        wp_enqueue_style('mypluginstyle', plugins_url('/assets/mystyle.css', __FILE__) );
        wp_enqueue_script('mypluginstyle', plugins_url('/assets/mystyle.js', __FILE__) );
    }

}

if(class_exists('pageauthors')){
    $raphplugin = new pageauthors();
    $raphplugin->register();
    // $raphplugin->activate();
    $raphplugin->deactivate();

}

function installer(){
    include('installer.php');
}

//Activate - Register Activation Hook(__FILE__, array($instance, function))
register_activation_hook(__FILE__, 'installer');

//Deactivate - Register Deactivation Hook(__FILE__, array($instance, function))
register_deactivation_hook(__FILE__, array($raphplugin, 'deactivate') );

?>

installer.php

<?php
$db = mysqli_connect('localhost','x','x','x');
    global $wpdb;
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

    if (count($wpdb->get_var('SHOW TABLES LIKE "wp_postsauthors"')) == 0){

        $sql = "CREATE TABLE `wp_postsauthors` 
        ( `ID` INT(200) NOT NULL AUTO_INCREMENT , `post_ID` INT(200) NOT NULL , 
        `author_name` VARCHAR(200) NOT NULL , `title` VARCHAR(200) NOT NULL , 
        `description` VARCHAR(200) NOT NULL , PRIMARY KEY (`ID`)) ENGINE = InnoDB;";

dbDelta($sql);

}

即使我把所有的东西都打对了,也没有任何东西能用

共有1个答案

司马建柏
2023-03-14

我要尽可能地简化事情。由于激活钩子具有类似异步的行为,因此调试起来总是很麻烦。

首先,您实际上不需要if检查表是否存在,这就是dbdelta已经为您做的事情。您可以稍后更改$SQL中定义的模式,dbdelta也将尝试解决这一问题,并为您自动处理。然而,在现实世界中,我发现半复杂的表逻辑并不总是通过alter table。相反,大多数人跟踪他们的模式版本,并在插件更新时运行表升级。但那是以后再说的。

第二,永远不要使用WordPress表前缀,那是自找麻烦。而是始终使用$WPDB->prefix

下面的代码是一个插件的最小版本,它可以完成您所要寻找的功能。而不是文件中的函数,我只是使用一个本地匿名函数。代码的大部分与您的代码相同,只是我的IDE自动为我设置了一些格式。这段代码是一个完整的插件,我建议首先测试它。一旦您确认了它的工作,您应该能够拉出激活逻辑。使用另一个文件是没有错的,我只是试着在我调试东西的时候移除一样多的分心。

<?php

/**
 * Plugin Name: Page Authors
 */

register_activation_hook(
    __FILE__,
    static function () {
        global $wpdb;
        require_once ABSPATH . 'wp-admin/includes/upgrade.php';

        // Never assume the prefix
        $table_name = $wpdb->prefix . 'postsauthors';

        $sql = "CREATE TABLE `${table_name}` 
                (
                    `ID` INT(200) NOT NULL AUTO_INCREMENT ,
                    `post_ID` INT(200) NOT NULL ,
                    `author_name` VARCHAR(200) NOT NULL ,
                    `title` VARCHAR(200) NOT NULL ,
                    `description` VARCHAR(200) NOT NULL ,
                    PRIMARY KEY (`ID`)) ENGINE = InnoDB;";

        dbDelta($sql);
    }
);
 类似资料:
  • 问题内容: 因此,我不断在多个服务器上收到此烦人的错误(它是一个警告,因此我将忽略它,但我需要该功能) 警告:curl_setopt()[function.curl- setopt]:启用safe_mode或在第56行的/home/xxx/public_html/xxx.php中设置了open_basedir时,无法激活CURLOPT_FOLLOWLOCATION 我将如何通过SSH解决此问题?

  • 我在Tomcat服务器中使用CXF公开了一个Web服务。我想在JMX中公开一些性能信息,比如由ResponseTimeFeature提出的那些信息。 我的cxf-beans.xml文件如下: 这与CXF JMX页面中的解释非常相似。 问题是,当我在[默认地址(service: jmx: rmi:///jndi/rmi://localhost:9913/jmxrmi)]使用j控制台连接时,我看不到任

  • 我试图通过NB Android插件在Mac上下载NetBeans7.4上的Android SDK。安装完成后,NetBeans警告我需要的几个模块没有被读取,无法安装,所以当我试图激活插件导入SDK时,它给了我一个错误:激活失败:不能启用所有请求的模块。 谁能帮我一下,告诉我出了什么问题吗?下面的三个链接(特别是最后一个)将帮助你们进一步参考问题,非常感谢。

  • 问题内容: 所以,我正在尝试以编程方式创建一个SceneView 但我收到此错误消息: 由于未捕获的异常“ NSGenericException”而终止应用程序,原因:“无法激活具有锚点的约束,并且它们没有共同的祖先。约束或其锚点是否引用了不同视图层次结构中的项目?那是非法的。 这是部分发生的。如何为该元素添加约束? 问题答案: dan是正确的,您需要先添加为子视图,然后才能锚定它。尝试这样的事情

  • 问题内容: 我在项目周围创建了一个virtualenv,但是当我尝试激活它时却无法。它可能只是语法或文件夹位置,但是我现在很困惑。 您可以在下面看到,我创建了virtualenv并将其称为venv。一切看起来不错,然后我尝试通过运行来激活它 我在想它可能只与我的系统路径有关,但不确定将其指向什么(我确实知道如何编辑路径)。我在python 7 / Windows操作系统上,虚拟环境2.2.x 问题

  • 不熟悉在虚拟环境中运行Python,会弄乱Django,无法激活虚拟环境。 在过去的4个小时里,试图在本地终端/VS代码上激活虚拟环境(venv),但运气不佳。 避免了“sudo pip install virtualenv”,因为我试图避免以root用户身份安装和使用不同的目录路径等。 使用缓存的virtualenv-20.0.31-py2.py3-none-any.whl(4.9 MB)收集v