在构建自定义查询时使用包含upgrade.php

时间:2014-07-14 作者:Neovea

我开始构建一个插件,其中需要使用wpdb 对象这是我第一次使用它。所以我查看了如何使用它。我看了一些例子,有一件事让我很困惑:upgrade.php

实际上,当我创建一个自定义查询时,只有当我包含upgrade.php 这样做:

require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
$custom_posts = $wpdb->get_results( \'SELECT * FROM \' . self::TABLE . \'\', OBJECT_K );
$wpdb->show_errors();
echo $wpdb->last_query;
return $custom_posts;
这只是我可以提供的方法示例之一。

有什么用upgrade.php ? 我的意思是,如果我不把它放进去,查询就不起作用了。请有人解释一下,因为法典中没有这方面的内容。

我真的有义务使用它吗?为什么?怎样

谢谢

更新:这里是完整的代码。

/**
 * On activate or uninstall plugin
 */
register_activation_hook( __FILE__, array( \'Cpt\', \'init\' ) );
register_deactivation_hook( __FILE__, array( \'Cpt\', \'uninit\' ) );
register_uninstall_hook( __FILE__, array( \'Cpt\', \'uninit\' ) );

global $wpdb;

class Cpt
{

    CONST TABLE = \'cpt\';

    /**
     * Constructor
     */
    public function init()
    {
        /**
         * Creation table for cpt
         */
        $sql = "CREATE TABLE IF NOT EXISTS `" . self::TABLE . "` (
          id mediumint(9) NOT NULL AUTO_INCREMENT,
          time datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
          name tinytext NOT NULL,
          UNIQUE KEY id (id)
        );";
        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        $wpdb->query($sql);

        self::convert_to(\'post\', \'custom\');
    }

    public function uninit() {
        /**
         * Delete table for cpt
         */
        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        //$wpdb->query("DROP TABLE IF EXISTS `cpt`;");
        //$this->delete_cpt("Custom post 1");
    }

    /**
     * Add a custom post type
     */
    public function add_cpt($name) {
        /**
         * Add a single data
         */
        $time = (string)date(\'dmY\');
        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        $wpdb->insert( 
            self::TABLE, 
            array(
                \'time\'=>$time, 
                \'name\'=>$name
            ) 
        );
        /*$wpdb->show_errors();
        echo $wpdb->last_query;
        die();*/
    }

    /**
     * Delete a custom post type
     */
    public function delete_cpt($name) {
        /**
         * delete a single data
         */
        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        $wpdb->delete( 
            self::TABLE, 
            array( 
                \'name\'=>$name 
            ) 
        );
        $wpdb->show_errors();
        echo $wpdb->last_query;
        die();
    }

    /**
     * Get all custom post types
     */
    public static function get_ctps() {
        /**
         * delete a single data
         */
        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        $custom_posts = $wpdb->get_results( \'SELECT * FROM \' . self::TABLE . \'\', OBJECT_K );
        $wpdb->show_errors();
        echo $wpdb->last_query;
        return $custom_posts;
    }

    /**
     * Get a single custom post type
     */
    public function get_ctp($name) {
        /**
         * get a single data
         */
        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        $custom_post = $wpdb->get_results( \'SELECT name FROM \' . self::TABLE . \' WHERE name = $name\', OBJECT_K );
        $wpdb->show_errors();
        echo $wpdb->last_query;
        print_r($custom_post);
        //return $custom_post;
    }

    /**
     * Post type conversion
     */
    public static function convert_to($from, $to) {

        // Get the posts of the type $from
        require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
        $wpdb->update( \'wp_posts\', array(\'post_type\'=>$to), array(\'post_type\'=>$from) );
        $wpdb->show_errors();
        echo $wpdb->last_query;
    }

    /**
     * Generate admin menu with all custom post types
     */
    public function generate_menu() {

        $custom_posts = self::get_ctps(); 
    }
}

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

不,事实上,您不应该包括wp admin/includes/upgrade。插件中的php文件。这样做没有真正有效的用例。它不会为您做任何事情,也不会为插件添加任何有用的功能。

至于你的问题,你说“它不起作用”,但你没有定义这意味着什么。当您提出问题时,提供收到的错误消息非常有用。

我注意到,在许多函数中,您试图调用$wpdb中的功能,而不声明global $wpdb; 第一请尝试用它替换require\\u一次。

SO网友:Pietro

在您的代码上下文中,包含没有任何用处,但要以另一种方式回答您的问题,请升级。php是一个定义dbDelta()函数的文件,如果MySQL表allready存在,可以使用该函数升级MySQL表。当插件升级到使用不同MySQL表的版本而不丢失数据时,这种机制很方便。

安装插件时创建自定义MySQL表的默认方式如下所述:
来源:Codex - Creating Tables with Plugins

下一步是实际创建数据库表。我们将使用wp admin/includes/upgrade中的dbDelta函数,而不是直接执行SQL查询。php(我们必须加载此文件,因为默认情况下它不会加载)。dbDelta函数检查当前的表结构,将其与所需的表结构进行比较,并根据需要添加或修改表,因此可以非常方便地进行更新(有关如何使用dbDelta的更多示例,请参阅wp admin/upgrade-schema.php)

因此,您可能希望放弃query()方法而使用dbDelta函数(),以保持文件的包含。

结束

相关推荐

WordPress脚本加载/卸载--wp_deregister_script(‘jQuery’)

我有几个关于WordPress加载/卸载javascript工具的问题。在阅读了彼得·古森(PieterGoosen)对一个问题的漂亮书面回复后,我开始了一些研究,并清理了我用来加载库的代码。此代码来自my child主题的函数。php文件。我的网站上有一些使用datepicker日历工具的功能。此外,我确信还有一些插件使用jQuery。function jquery_loadup() { //wp_deregister_script(\'jquery\'); <---