it-swarm-pt.tech

interações de banco de dados usando OOP

Estou desenvolvendo o plugin wordpress que armazena dados no banco de dados. Eu tentei iniciar OOP caminho para o meu plugin de acordo com o clichê de melhores práticas: https://github.com/DevinVinson/WordPress-Plugin-Boilerplate/tree/master/plugin-name

Coisa que não consigo entender é como chamar o método de criação de tabelas apenas uma vez - no evento de instalação do plugin e tornar todas as interações seguras. Além disso, quero agendar algumas tarefas de carregamento através do cron.

Eu descobri que existem duas maneiras para o primeiro objetivo:

  • Torne todos os métodos public static para que a classe db loader torne-se apenas wrapper em torno da instância wpdb. Mas não é seguro o suficiente, não é?

  • Inicialize a instância do carregador do banco de dados toda vez que o plugin precisar. (com métodos privados e assim por diante)

A questão é como inicializar a instância da classe db loader corretamente para criar todas as tabelas apenas uma vez e evitar métodos estáticos públicos?

Este é o código do boilerplate:

    /**
    * 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();

É o principal exemplo de classe de plugins:

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
powercat

Esta é potencialmente uma questão bastante envolvida, então eu posso não ser totalmente rigoroso na minha resposta, mas isso deve lhe dar um bom começo ao criar e excluir tabelas.

Inclua as seguintes linhas na sua função plugin _construct () de class_my_plugin.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');
}

Inclua estas funções em class_my_plugin.php dentro da própria classe:

function your_plugin_installation() {
    create_data_tables();
}

function your_plugin_unset() {
    //do whatever here for users that deactivate the plugin
}

Fora da classe de plugins principal, adicione estas funções:

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
}

Note que eu geralmente coloco o seu_plugin_uninstall fora da classe principal, pois você receberá um erro se ele estiver dentro da classe principal quando um usuário desinstala.

Isso ajudará você a criar e excluir as tabelas quando o usuário instalar e desinstalar. Isso, portanto, acontecerá apenas uma vez e as funções serão ignoradas, a menos que os ganchos de instalação ou desinstalação sejam disparados.

As tabelas podem ser facilmente acessadas usando a funcionalidade padrão WP, por exemplo.

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;
}

Espero ter interpretado sua pergunta corretamente e que isso ajude de alguma forma.

1
Clinton