web-dev-qa-db-fra.com

Appelez le crochet d'activation plusieurs fois

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?

3
ahnkee

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:

2
fuxia