如何在插件中正确创建表

时间:2011-06-04 作者:Bosworth99

Okay=正在开发我发布的插件over here, 我遇到了一些麻烦。

我决定从头开始编写插件。正如我所指出的,这是一个定制的ajax库/组合,我正试图将其管理工作纳入wp admin。最终的目标是使用wp进行查询/排序,并通过该插件将xml或json传递回httprequest。

首先,当插件第一次被激活时,我试图创建一个新表,并向其中插入一些测试数据(我遵循wordpress codex 指南。)然而,当插件成功激活时,什么都没有发生。我没有(再)收到错误,但没有插入表,也没有添加数据。

我意识到codex脚本是程序性的,我正在使用一个类,但我认为所有内容的范围都是正确的。事实上我不知道是不是,特别是global $wpdb. 我对php还是相当陌生的-它似乎有一些我还不太熟悉的范围界定怪癖。

无论如何,这就是我目前所得到的。非常简单,但还没有成功。

<?php  
    /* 
    Plugin Name: B99 Portfolio
    Plugin URI: http://www.joshbosworth.com/
    Description: B99 Portfolio data logic
    Version: 0.1
    Author: Josh Bosworth
    Author URI: http://www.joshbosworth.com 
    */  

    global $b99_pf_db_version;
    $b99_pf_db_version = "1.0";

    if ( !class_exists( \'B99_Portfolio\')){
        require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');

    class B99_Portfolio
    {
        public function B99_Portfolio(){}

        public function __construct(){
            add_action(\'admin_menu\', array( &$this, \'b99_portfolio_admin_actions\' ));
        }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //              admin 
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        public function b99_portfolio_admin_actions(){
            add_media_page( \'B99 Portfolio\', \'B99 Portfolio\',  \'manage_options\', \'B99_Portfolio\', array( &$this, \'b99_portfolio_admin\'));
        }

        public function b99_portfolio_admin(){
            if (!current_user_can(\'manage_options\'))  
                {
                        wp_die( __(\'You do not have sufficient permissions to access this page.\') );
                }
                include(\'b99-portfolio-admin.php\');
        }

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //              db table 
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        var $table_name;

        public function b99_pf_install(){  
            global $wpdb;

            $this->table_name = $wpdb->prefix . "b99_pf";

            $sql = "CREATE TABLE " . $this->table_name . " ( //changed to class var
                id mediumint(9) NOT NULL AUTO_INCREMENT,
                time datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
                title tinytext NOT NULL,
                cat tinytext DEFAULT NOT NULL,  //changed from \'default\'
                tag tinytext NOT NULL,
                note text NOT NULL,
                date tinytext NOT NULL,
                hr_path tinytext NOT NULL,
                lr_path tinytext NOT NULL, 
                UNIQUE KEY id (id)
            );";

            dbDelta($sql);

            add_option("b99_pf_db_version", $b99_pf_db_version);
        }

        public function b99_pf_install_data(){
            global $wpdb;

            $title  = \'Testing Furiously\';
            $cat    = \'illustration,design\';
            $tag    = \'sketch\';
            $note   = \'Seriously Testing\';
            $date   = \'june 2008\';
            $hr_path= \'hr/testing.furiously-hr.jpg\';
            $lr_path= \'lr/testing.furiously-lr.jpg\';

            $rows_affected = $wpdb->insert( $this->table_name, array( \'time\'  => current_time(\'mysql\'), //changed table_name to class var
                                                                \'title\' => $title,
                                                                \'cat\'   => $cat,
                                                                \'tag\'   => $tag,
                                                                \'note\'  => $note,
                                                                \'hr_path\'=>$hr_path,
                                                                \'lr_path\'=>$lr_path
                                                               ) );
        }


        } //end class
    }

    if( class_exists(B99_Portfolio)){
        $b99_PF = new B99_Portfolio();

        register_activation_hook(__FILE__, array(&$b99_PF, \'b99_pf_install\'));
        register_activation_hook(__FILE__, array(&$b99_PF, \'b99_pf_install_data\'));
    }

    ?>
任何建议都是最好的。坦率地说,对我的总体计划采取不同或相反的态度也可以。

提前谢谢。

顺便问一下,我该怎么调试wordpress?我正在使用netbeans/xampp。。。

=更新=

好的-能够启动并运行xdebug(谢谢!)。关于这段代码,我还有几个问题。

-Just general php - 我对可变范围有点困惑

$classvar // implied public modifier?

private function someFunction(){
$classvar // let me get this straight - this is a new local var 
$classvar !=$this->classvar? // right? if so thats an important clarification...
}

-$wpdb

为什么?

global $wpdb
$rows_affected = $wpdb->insert(...
而且不仅仅是

global $wbdb->insert(...

-register_activation_hook / wordpress db rebuild.

我注意到,激活钩子在每次加载管理页面时都会运行,而不仅仅是在插件被“激活”时,这似乎是合乎逻辑的行为。而且似乎wp查询也会重建,或者至少在整个wordpress数据库上运行dbDelta,每次重建管理页面也会这样?并不是说这似乎是错的,但我不知道为什么。我应该注意,我只是使用myPhpAdmin来查看表是否被添加到db结构中。

很明显,我整个职业生涯都在为客户服务;)虽然我过去使用过很多php功能,但这可能是我第一次尝试“简单”的服务器端例程或复制/粘贴以外的任何操作。无论如何-谢谢你的帮助-

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

我看到两个问题-

$this->table_name = $wpdb->prefix . "b99_pf";

$sql = "CREATE TABLE " . $table_name . " (
$table_name 将是未定义的,应该是$this->table_name

在您的查询中:

cat tinytext default NOT NULL
我想不会是这样的default 在那里。

EDIT - 要回答调试问题-xdebug, xdebug and netbeans

结束

相关推荐