Использование в том числе upgrade.php при построении пользовательских запросов


Я начал создавать плагин, в котором мне нужно создать несколько пользовательских запросов с объектом 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(); 
    }
}
 1
Author: Neovea, 2014-07-14

2 answers

Нет, и на самом деле вы не должны включать wp-admin/includes/upgrade.php файл в плагине. Для этого нет реального допустимого варианта использования. Он ничего не делает для вас и не добавляет никаких полезных функций для плагина.

Что касается вашего вопроса, вы говорите "это не работает", но вы не можете определить, что это значит. Предоставление сообщений об ошибках, которые вы получаете, полезно, когда вы задаете вопросы.

Я отмечаю, что в ряде функций вы пытаетесь вызвать функциональность в $wpdb без предварительного объявления global $wpdb;. Попробуйте вместо этого заменить require_once на это.

 0
Author: Otto, 2014-07-15 16:31:32

В контексте вашего кода включение не имеет смысла, но, чтобы ответить на ваш вопрос по-другому, upgrade.php это файл, который определяет функцию dbDelta(), которую можно использовать для обновления таблицы MySQL, если она уже существует. Этот механизм пригодится при обновлении плагина до версии, которая использует различные таблицы MySQL без потери данных.

Способ создания пользовательской таблицы MySQL по умолчанию при установке плагина указан здесь:
источник: Создание кодекса Таблицы с плагинами

Следующим шагом является фактическое создание таблицы базы данных. Вместо того, чтобы выполнять SQL-запрос напрямую, мы будем использовать функцию dbDelta в wp-admin/includes/upgrade.php (нам придется загрузить этот файл, так как по умолчанию он не загружен). Функция dbDelta проверяет текущую структуру таблицы, сравнивает ее с желаемой структурой таблицы и либо добавляет, либо изменяет таблицу по мере необходимости, поэтому она может быть очень удобна для обновлений (см. wp-admin/upgrade-schema.php для получения дополнительных примеров использования dbDelta)

Таким образом, вы можете отказаться от метода query() в пользу функции dbDelta(), сохранив включение файла.

 1
Author: Pietro, 2015-07-25 12:57:26