Je développe un plugin wordpress qui stocke des données dans une base de données. J'ai essayé de démarrer OOP chemin pour mon plugin selon boilerplate de Best Practicies: https://github.com/DevinVinson/WordPress-Plugin-Boilerplate/tree/master/plugin-name
Ce que je ne comprends pas, c'est comment appeler la méthode de création de tables une seule fois - lors de l'installation d'un plug-in et sécuriser toutes les interactions. En outre, je veux planifier certaines tâches de chargement via cron.
J'ai compris qu'il y avait deux manières d'atteindre le premier objectif:
Faites en sorte que toutes les méthodes soient publiques afin que la classe du chargeur db devienne simplement une enveloppe autour de l'instance wpdb. Mais ce n'est pas assez sécurisé, n'est-ce pas?
Initialisez l'instance du chargeur de base chaque fois que le plug-in est nécessaire. (avec des méthodes privées et ainsi de suite)
La question est de savoir comment initialiser correctement l’instance de la classe du chargeur db pour ne créer toutes les tables qu’une fois et éviter les méthodes statiques publiques.
C'est le code de 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();
C'est l'exemple de classe du plugin principal:
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);
}
}
Cette question est potentiellement assez complexe, je ne suis donc peut-être pas totalement rigoureux dans ma réponse, mais cela devrait vous donner un bon départ pour la création et la suppression de tableaux.
Incluez les lignes suivantes dans votre fonction 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');
}
Incluez ces fonctions dans class_my_plugin.php dans la classe elle-même:
function your_plugin_installation() {
create_data_tables();
}
function your_plugin_unset() {
//do whatever here for users that deactivate the plugin
}
En dehors de la classe du plugin principal, ajoutez les fonctions suivantes:
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
}
Notez que je place généralement your_plugin_uninstall en dehors de la classe principale, car vous obtiendrez une erreur s’il se trouve dans la classe principale lors de la désinstallation de l’utilisateur.
Cela vous aidera à créer et à supprimer les tables lors de l'installation et de la désinstallation de l'utilisateur. Cela ne se produira donc qu’une seule fois et les fonctions seront ignorées à moins que les points d’installation ou de désinstallation ne soient activés.
Les tables sont facilement accessibles à l’aide de la fonctionnalité WP standard, par ex.
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;
}
J'espère que j'ai bien interprété votre question et que cela aide d'une certaine manière.