Squelette de la classe d’une extension WordPress

Dans cet article, je vous propose un exemple de structure de classe contenant les fonctionnalités les plus utilisées pour une extension. Vous pouvez l'utiliser comme squelette de base pour votre propre extension.

Avant de vous lancer, n'oubliez pas lire l'article « Comment débuter le développement d’une extension WordPress » afin de tout mettre en place pour un développement réussi.

▼Publicité

Ce squelette est présenté dans une version assez complète mais tout de même simplifiée. Il utilise la notation phpDocumentor, aussi appelée phpDoc, pour documenter la classe, ses constantes, ses propriétés et ses méthodes.

Afin de vous aider à mieux comprendre ce squelette, les mots ayant un lien ensemble ont été surlignés d'une même couleur.

Rappelons que pour la localisation des chaînes de caractères, le domaine de localisation à utiliser a été précisé dans l'entête standard.

Ex :

WordPress (PHP)

<?php

/**

 * Plugin Name: Mon Extension

 * Text Domain: monprefixe-mon-extension

 * ...

 */

?>

Voici donc le squelette de votre extension :

WordPress (PHP)

/**

 * Constante pour la version de l'extension.

 *

 * @var string MONPREFIXE_VERSION Numéro de version de l'extension.

 */

if ( ! defined( 'MONPREFIXE_VERSION' ) ) {

    define( 'MONPREFIXE_VERSION', '1.0.0' );

}

 

/**

 * Extension qui permet de ... (ne pas oublier le point à la fin de la description).

 *

 * Description longue.

 */

class Monprefixe_Mon_Extension {

 

    /**

     * Champ pour ... (ne pas oublier le point à la fin de la description).

     *

     * @var type $... Description.

     */

    // private $...

 

    // **************************************************

    /**

     * Initialiser les traitements nécessitant des méthodes statiques.

     *

     * @return void

     */

    public static function init() {

        // ...

    } 

 

    // **************************************************

    /**

     * Constructeur.

     *

     * @return void

     */

    public function __construct()

        // enregistrement du numéro de version dans la base de données seulement s'il n'y était pas déjà

        // si on passe à une nouvelle version, on ajustera le numéro dans la BD (update_site_option)

        // mais seulement après avoir fait les autres ajustements nécessaires

        add_site_option('monprefixe_mon_extension_version', MONPREFIXE_VERSION); 

 

       // création des tables personnalisées lorsque l'extension est activée

        // (pendant le développement, si l'extension est déjà activée, il faudra la désactiver et la réactiver pour que la fonction de rappel soit appelée)

        register_activation_hook( __FILE__, array( $this, 'creer_tables' ) );

 

        // ajustements en cas où la version de l'extension aurait changé

        add_action( 'plugins_loaded', array( $this, 'ajuster_version' ) );

 

        // shortcode défini par l'extension

        add_shortcode( 'monprefixemonshortcode', array( $this, 'shortcode_mon_shortcode' ) );

 

        // ajout d'une option de menu dans le tableau de bord

        add_action( 'admin_menu', array( $this, 'ajouter_menu_tableau_de_bord' ) );  

 

        // feuille de style et JavaScript de l'extension, côté site Web

        add_action( 'wp_enqueue_scripts', array( $this, 'charger_css_js_web' ) );

 

        // feuille de style et JavaScript de l'extension, côté tableau de bord

        add_action( 'admin_enqueue_scripts', array( $this, 'charger_css_js_admin' ) );

 

        // chargement des chaînes de localisation et autres actions à réaliser APRÈS le chargement du thème et des extensions

        add_action( 'init', array( $this, 'apres_chargement_theme_et_extensions' ) );

 

        // nettoyage lorsqu'un usager se déconnecte

        add_action( 'wp_logout', 'nettoyage' );

 

        // ...

    }

 

    // **************************************************

    /**

     * Créer les tables personnalisées.

     *

     * @return void

     */

    public function creer_tables() {

        global $wpdb;

 

        // retrouver le moteur de stockage utilisé par les tables WordPress

        $requete = "SELECT engine FROM information_schema.tables WHERE table_schema = '$wpdb->dbname' AND table_name = '$wpdb->posts'";

        $moteur_seul = $wpdb->get_var( $requete );

 

        if ( is_null( $moteur_seul ) ) {

            $moteur_seul = "MyISAM";// moteur par défaut si on ne réussit pas à le retrouver

        }

        $engine = "ENGINE $moteur_seul";

 

        // retrouver le jeu de caractères et l'interclassement

        $charset_collate = $wpdb->get_charset_collate();   // chaine au format DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

 

        $table_matable = $wpdb->prefix . 'monprefixebd_matable';

        $sql = "CREATE TABLE $table_matable (

            matable_id bigint(20) unsigned NOT NULL auto_increment,

            matable_description varchar(50) NOT NULL,

            matable_autrechamp int NULL,

            PRIMARY KEY  (matable_id)

        ) $engine $charset_collate;";

 

        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

        dbDelta( $sql );

 

        $table_autretable = $wpdb->prefix . 'monprefixebd_autretable';

        // ...

 

        // création des contraintes seulement si InnoDB et si contrainte pas déjà créée

        if ( strtoupper( $moteur_seul ) == 'INNODB' ) {

            $requete = "SELECT COUNT(*) FROM information_schema.key_column_usage WHERE table_name = '$table_matable' AND column_name = 'champ1' AND referenced_table_name = '$table_autretable' AND referenced_column_name = 'champ2' AND table_schema = '$wpdb->dbname'";

            $presence_contrainte = $wpdb->get_var( $requete );

 

            if ( is_null( $presence_contrainte ) ) {

                $presence_contrainte = 0;    // valeur si on ne réussissait pas à retrouver l'info dans la BD

            }

   

            if ( ! $presence_contrainte ) {

                $requete = "ALTER TABLE $table_matable ADD CONSTRAINT FOREIGN KEY (champ1) REFERENCES $table_autretable (champ2)";

 

                if ( ! $wpdb->query( $requete ) ) {

                    // réagir en cas de problème

                    // ...

                }

            }

        }  

 

        // Insertion des données initiales (vérifier d'abord si la table est vide)

        // ...

        //if ( ... ) {

            $donnees = array(

                array( 'chaîne 1', 10),

                array( 'chaîne 2', 20),

                array( 'chaîne 3', 30),

            );

 

            foreach( $donnees as $donnee ) {

                $reussite = $wpdb->insert(

                    $table_matable,

                    array(

                        'champ1' => $donnee[0],

                        'champ2' => $donnee[1],

                    ),

                    array(

                        '%s',

                        '%d',

                    )

                );

               

                if ( ! $reussite ) {

                    // réagir en cas de problème

                    // ...

                }

            }

        //}

 

        // ...

    }

 

    // **************************************************

    /**

     * Ajuster les tables lorsque la version de l'extension a changé.

     *

     * @return void

     */

    public function ajuster_version() {

        global $wpdb; 

 

        $version = get_site_option( 'monprefixe_mon_extension_version' );

 

        if( version_compare( $version, MONPREFIXE_VERSION, '<' ) ) {

            // lors d'un changement de version, register_activation_hook() n'est pas appelé alors on fait le travail ici

            $this->creer_tables();

            update_site_option( 'monprefixe_mon_extension_version', MONPREFIXE_VERSION ); 

        }

 

       // ...

    }

 

    // **************************************************

    /**

     * Fonction de rappel du shortcode.

     *

     * @return void

     */

    public function shortcode_mon_shortcode() {

        $code_html = "";

 

        // écrire les lignes de code pour générer le code HTML qui remplacera le shortcode

        // ...

 

        return $code_html;

    }

 

    // **************************************************

    /**

     * Fonction de rappel pour ajouter des options de menu dans le tableau de bord.

     *

     * @return void

     */

    public function ajouter_menu_tableau_de_bord() {

        global $monprefixe_hook_admin;

        global $monprefixe_hook_ajout;

        // ...

 

        // ajout d'une option de menu sous le menu Paramètres (Settings en anglais)

        $monprefixe_hook_admin = add_options_page(

            __( "Mon extension - Configuration", "monprefixe-mon-extension" ),   // texte de la balise <title>

            __( "Mon extension", "monprefixe-mon-extension" ),   // titre de l'option de menu

            "manage_options",   // droits requis pour voir l'option de menu

            "monprefixe_configuration",   // slug. L'URL de la page sera sous la forme mondomaine.com/wp-admin/options-general.php?page=monprefixe_configuration

            array( $this, "creer_page_configuration" )   // fonction de rappel pour créer la page

        );

 

        // ou, si on préfère ajouter l'option de menu directement dans le menu principal du tableau de bord

        // (faire add_options_page OU add_menu_page, pas les deux)

        $monprefixe_hook_admin = add_menu_page(

            __( "Mon extension - Gestion", "monprefixe-mon-extension" ),   // texte de la balise <title>

            __( "Mon extension", "monprefixe-mon-extension" ),   // titre de l'option de menu

            "manage_options",   // droits requis pour voir l'option de menu

            "monprefixe_gestion",   // slug. L'URL de la page sera sous la forme mondomaine.com/wp-admin/admin.php?page=monprefixe_gestion

            array( $this, "creer_page_gestion" )   // fonction de rappel pour créer la page

        );

 

        // au besoin, créer des sous-options dans le menu qui vient d'être ajouté

        // première option du sous-menu : redéfinit les mêmes critères que le menu

        add_submenu_page(

            "monprefixe_gestion", // slug du menu parent

            __( "Mon extension - Gestion", "monprefixe-mon-extension" ),   // texte de la balise <title>

            __( "Gestion", "monprefixe-mon-extension" ),   // titre de l'option de sous-menu

            "manage_options",   // droits requis pour voir l'option de menu

            "monprefixe_gestion",   // slug

            array( $this, "creer_page_gestion" )   // fonction de rappel pour créer la page

        );

 

        // autres options du sous-menu

        $monprefixe_hook_ajout = add_submenu_page(

            "monprefixe_gestion", // slug du menu parent

            __( "Mon extension - Ajouter un ...", "monprefixe-mon-extension" ),   // texte de la balise <title>

            __( "Ajouter un ...", "monprefixe-mon-extension" ),   // titre de l'option de sous-menu

            "manage_options",   // droits requis pour voir l'option de menu

            "monprefixe_ajout",   // slug. L'URL de la page sera sous la forme mondomaine.com/wp-admin/admin.php?page=monprefixe_ajout

            array( $this, "creer_page_ajout" )   // fonction de rappel pour créer la page

        );

 

        // ...

    }

 

    // **************************************************

    /**

     * Créer la page de configuration (affichée par l'option de menu sous Paramètres).

     *

     * @return void

     */

    public function creer_page_configuration() {

        global $wpdb;

        global $title;   // titre de la page du menu, tel que spécifié dans la fonction add_options_page

 

        echo '<div class="wrap">';

        echo "<h1>$title</h1>";

        // ...

 

        // l'API WordPress vérifie si l'usager détient les droits requis, tel que précisé lors de l'ajout de l'option de menu. On peut toutefois exiger des droits plus élevés pour certaines sections de la page.

        if ( current_user_can( '...' ) ) {

             // ...

        }

 

        echo '<form ...>'

        // ...

        echo '</form>';

 

        echo '</div>'; // <div class="wrap">

    }

 

    // **************************************************

    /**

     * Créer la page de gestion (affichée par l'option de menu placée directement dans le menu principal du tableau de bord).

     *

     * @return void

     */

    public function creer_page_gestion() {

        global $wpdb;

        global $title;   // titre de la page du menu, tel que spécifié dans la fonction add_menu_page

 

        echo '<div class="wrap">';

        echo "<h1>$title</h1>";

        // ...

 

        // l'API WordPress vérifie si l'usager détient les droits requis, tel que précisé lors de l'ajout de l'option de menu. On peut toutefois exiger des droits plus élevés pour certaines sections de la page.

        if ( current_user_can( '...' ) ) {

             ...

        }

 

        echo '<table class="widefat ...">';

        // ...

        echo '</table>';

 

        echo '</div>'; // <div class="wrap">

    }

 

    // **************************************************

    /**

     * Créer la page d'ajout (affichée par une sous-option du menu placée directement dans le menu principal du tableau de bord).

     *

     * @return void

     */

    public function creer_page_ajout() {

        global $wpdb;

        global $title;   // titre de la page du menu, tel que spécifié dans la fonction add_submenu_page

 

        echo '<div class="wrap">';

        echo "<h1>$title</h1>";

        // ...

 

        echo '<form ...>'

        // ...

        echo '</form>';

 

        echo '</div>'; // <div class="wrap">

    }

 

    // **************************************************

    /**

     * Charger le css et le js côté site Web.

     *

     * @return void

     */

    function charger_css_js_web() {

        wp_enqueue_style( 'monprefixe-mon-extension', plugins_url( 'css/mon-extension.css', __FILE__ ) );

        wp_enqueue_script( 'monprefixe-monextension-js', plugins_url( 'js/mon-extension.js', __FILE__ ) );

    }

 

    // **************************************************

    /**

     * Charger le css et le js pour des pages ciblées du tableau de bord.

     *

     * @param string $hook Hook de la page actuellement chargée.

     *

     * @return void

     */

    function charger_css_js_admin( $hook ) {

        global $monprefixe_hook_admin;    // variables initialisées dans ajouter_menu_tableau_de_bord()

        global $monprefixe_hook_ajout;

        // ...

 

        if ( $hook == $monprefixe_hook_admin || $hook == $monprefixe_hook_ajout ) {

            wp_enqueue_style( 'monprefixe-mon-extension-admin', plugins_url( 'css/admin.css', __FILE__ ) );

            wp_enqueue_script( 'monprefixe-mon-extension-admin-js', plugins_url( 'js/admin.js', __FILE__ ) );

        }

    }

 

    // **************************************************

    /**

     * Charger les chaînes de localisation et effectuer autres actions à réaliser APRÈS le chargement du thème et des extensions.

     *

     * @return void

     */

    public function apres_chargement_theme_et_extensions() {

        // il faut charger les fichiers de localisation dans le hook init et pas avant 

        // afin de permettre aux thèmes d'utiliser un hook de load_textdomain()

        // qui leur permettra de modifier l'emplacement des fichiers .mo qu'ils auront ajustés

        load_plugin_textdomain( 'monprefixe-mon-extension', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );

 

        // pour pouvoir utiliser des variables de session

        if ( ! session_id() ) {

            @session_start();

        }

 

        // ...

    }

 

    // **************************************************

    /**

     * Effectuer le nettoyage lorsqu'un usager se déconnecte.

     *

     * @return void

     */

    public function nettoyage() {

        // vider les variables de session créées par l'extension 

        if ( isset( $_SESSION['monprefixe-mavariable'] ) ) {

            unset( $_SESSION['monprefixe-mavariable'] );

        }

    }

 

    // ...

 

}   // fin de la définition de la classe

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories