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