使用面向对象的数据库交互

时间:2018-08-01 作者:powercat

我正在开发wordpress插件,将数据存储在数据库中。我试图根据最佳实践的样板文件为我的插件启动OOP方式:https://github.com/DevinVinson/WordPress-Plugin-Boilerplate/tree/master/plugin-name

我不明白的是,如何在插件安装事件中一次性调用creating tables方法,并确保所有交互的安全。另外,我想通过cron安排一些加载任务。

我发现有两种方法可以实现第一个目标:

使所有方法都是公共静态的,这样db loader类就成了wpdb实例的包装器。但这不够安全,不是吗?

每当插件需要时,初始化db loader实例。(使用私人方法等)

问题是如何正确初始化db loader类实例,以便只创建一次所有表,并避免使用公共静态方法?

这是样板文件中的代码:

    /**
    * Core plugin class
    */
    require_once plugin_dir_path(__FILE__) . \'includes/class_my_plugin.php\';


    function run_my_plugin() {
        $plugin = new my_plugin();
        $plugin->run();
    }

    run_my_plugin();
主要插件类示例:

class my_plugin {

private
    $wpdb,
    $table_prefix,
    $charset_collate;


public function __construct() {
    global $wpdb;

    $this->wpdb = &$wpdb;
    $this->table_prefix = $this->wpdb->prefix . \'test_private_\';
    $charset_collate = $this->wpdb->get_charset_collate();

}

public function run() {

    $table_name = $this->table_prefix . \'desks\';


    $sql = "CREATE TABLE IF NOT EXISTS $table_name ( 
    some_id int(11) NOT NULL AUTO_INCREMENT,
    some_title VARCHAR(50) NOT NULL,
    PRIMARY KEY  (desk_id)
    ) $this->charset_collate;";

    dbDelta($sql);

}

}

1 个回复
最合适的回答,由SO网友:Clinton 整理而成

这可能是一个相当复杂的问题,因此我的回答可能不太严谨,但这应该会给您在创建和删除表时提供一个良好的开端。。

在class\\u my\\u plugin的plugin \\u construct()函数中包括以下几行。php:

if (is_admin()){
    //manage the the database tables when registering or deactivating
    register_activation_hook($loc, array($this, \'your_plugin_installation\'));
    register_deactivation_hook($loc, array($this, \'your_plugin_unset\'));
    register_uninstall_hook ($loc, \'your_plugin_uninstall\');
}
在class\\u my\\u plugin中包含这些函数。类本身中的php:

function your_plugin_installation() {
    create_data_tables();
}

function your_plugin_unset() {
    //do whatever here for users that deactivate the plugin
}
在主插件类之外添加以下函数:

function your_plugin_uninstall() {
    delete_db_tables();
    //add whatever else you need to do to clean up
}

function create_data_tables() {
    global $wpdb;
    require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
    $table_name = $this->table_prefix . \'desks\';
    $charset_collate = $wpdb->get_charset_collate();
    if( $wpdb->get_var("SHOW TABLES LIKE \'".$table_name."\'") != $table_name ) {
       $sql = "CREATE TABLE IF NOT EXISTS ".$table_name;
       $sql .= " (some_id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, ";
       $sql .= "some_title varchar(31) NOT NULL DEFAULT \'\', ";
       $sql .= "PRIMARY KEY (some_id)) ".$charset_collate;
        dbDelta( $sql );
    }
    // repeat the if {} statement for each table you want to create
}

function delete_db_tables() {
    global $wpdb;
    $table_name = $this->table_prefix . \'desks\';
    $wpdb->query( "DROP TABLE IF EXISTS ".$table_name );
    //delete your tables here
}
请注意,我通常将您的\\u plugin\\u卸载放在主类之外,因为当用户卸载时,如果它位于主类之内,则会出现错误。

这将帮助您在用户安装和卸载时创建和删除表。因此,这只会发生一次,除非启动安装或卸载挂钩,否则这些函数将被忽略。

可以使用标准WP功能轻松访问这些表,例如:。

function so_get_some_title($id,) {
    global $wpdb;
    $id = (int) $id;
    $query = "SELECT some_id, some_title FROM ".$table_name." WHERE some_id = ".$id;
    $recs = $wpdb->get_results($query,ARRAY_A);
    }
    return $recs;
}
我希望我正确地解释了你的问题,这在某种程度上有所帮助。

结束

相关推荐

WP无法将文件上传到媒体库,/wp-admin/async-pload.php 403被禁用

我在大量网站上搜索过这个问题,但我没有找到任何好的解决方案。这些问题在网络上似乎很常见。以下是详细信息。。。如果我试图在媒体库部分直接上传文件,Chrome控制台会显示两个对/wp admin/async upload的调用。php文件:第一个返回一个成功的200回复(文件已上载),第二个显示303禁止回复,因此不显示该文件。正在重新加载页面,我的图片就在那里。。。多大的迷雾啊!真正的问题是,当我试图在帖子上附加一个特色图片时:图书馆不会出现!弹出窗口,但加载程序继续旋转,没有显示图像。如果我尝试上载新图