J'ai un plugin qui fait des trucs d'initialisation en utilisant register_activation_hook
appelé depuis sa __construct()
.
Depuis, j'ai étendu mon plugin pour y ajouter des fonctionnalités. Par souci d'organisation, j'ai déplacé les fonctions étendues vers sa propre classe. J'ai besoin de créer une table qui traitera des données propres à cette nouvelle classe.
Ma nouvelle classe est instanciée à partir de la construction de mon plugin principal. Et à partir de la construct
de ma nouvelle classe, j'essaie d'appeler register_activation_hook
une deuxième fois pour créer ma table. Sans surprise, cela ne semble pas fonctionner. (J'ai testé mon code de création de base de données ailleurs et cela fonctionne).
Puis-je utiliser le register_activation_hook
de ma nouvelle classe pour m'assurer que la base de données est créée lors de l'activation, ou peut-être même se greffer sur la classe parente pour s'assurer que la base de données est créée?
Utilisez une sorte de contrôleur et combinez les appels des deux classes dans un rappel pour chaque action. Le contrôleur doit être responsable de l'affectation réelle de la logique métier à un événement (action) et non à un code en dehors de vos classes.
Le point fondamental est que: votre contrôleur de plug-in ne doit pas modifier les données, seuls les modèles doivent le faire.
L'exemple suivant montre comment créer une table (j'utilise une option ici pour que les choses restent simples) et une option:
<?php # -*- coding: utf-8 -*-
namespace WPSE;
/**
* Plugin Name: Multiple De/Activation Objects
*/
\register_activation_hook(
__FILE__,
array ( Front_Controller::get_instance(), 'activate' )
);
\register_deactivation_hook(
__FILE__,
array ( Front_Controller::get_instance(), 'deactivate' )
);
class Front_Controller
{
protected static $instance = NULL;
protected $db_name = 'wpse_db';
protected $option_name = 'wpse_option';
public static function get_instance()
{
if ( NULL === self::$instance )
self::$instance = new self;
return self::$instance;
}
public function activate()
{
$db = new Db( $this->db_name );
$db->create_table();
$option = new Option( $this->option_name );
$option->add();
}
public function deactivate()
{
$db = new Db( $this->db_name );
$db->delete_table();
$option = new Option( $this->option_name );
$option->remove();
}
}
class Db
{
protected $db_name;
public function __construct( $db_name )
{
$this->db_name = $db_name;
}
public function create_table()
{
// install table, for this demonstration, we use an option
return \add_option( $this->db_name, 'exists' );
}
public function delete_table()
{
// uninstall table
return \delete_option( $this->db_name );
}
}
class Option
{
protected $option_name;
public function __construct( $option_name )
{
$this->option_name = $option_name;
}
public function add()
{
// add option
return \add_option( $this->option_name, 'exists' );
}
public function remove()
{
// delete option
return \delete_option( $this->option_name );
}
}
Vous pouvez tester le succès avec un deuxième plugin:
add_action( 'admin_footer', function() {
$db = get_option( 'wpse_db', 'missing' );
$option = get_option( 'wpse_option', 'missing' );
print "<code>\$db = $db, \$option = $option</code>";
});
Quelques liens pour en savoir plus: