Création des fichiers

Aller dans le répertoire wp-content/plugins et créer un répertoire "myplugin". Créer le fichier myplugin/myplugin.php

cd wp-content/plugins
mkdir myplugin
vim myplugin/myplugin.php

Dans le fichier myplugin/myplugin.php, il faut inscrire les métas-données à propos de l'extension dans les premiers 8K du fichier.

<?php
/**
 * Plugin Name: My Plugin
 * Description: Ceci est mon premier Plugin pour Wordpress
 * Version: 1.0
 * Author: Yan Morin
 */
?>

Se fichier sera lu par wordpress pour construire la liste des extensions. On peut aussi ajouter les champs Plugin URI, Author URI, Text Domain, Domain path, Network. Il ne faut plus utiliser Site Wide Only. On peut mettre du HTML dans la partie Description, il sera rendu tel quel dans la liste des extensions.

Par défaut, Wordpress fait une liste de tous les fichiers .php du répertoire plugins/ et des répertoires plugins/nom-du-plugin/. Je préfère nommer le fichier avec le même nom que le répertoire. C'est une bonne idée de limiter les fichiers .php à la racine de votre répertoire et de créer un répertoire interne séparé, exemple: lib/ ou src/. C'est la fonction get_plugins (wp-admin/includes/plugin.php) qui liste ses fichiers PHP et get_file_data (wp-includes/functions.php) qui lit les entêtes de fichiers à la recherche des champs. La liste des champs lu est définie dans get_plugin_data (wp-admin/includes/plugin.php).

Et voilà, vous avez maintenant une extension Wordpress que vous pouvez l'activer.

Activation

Pour activer votre extension, il faut aller dans le menu Extensions de l'admin Wordpress (wp-admin/plugins.php) et cliquer sur le lien Activer en dessous du nom de votre extension.

Interne

La liste des extensions actives est dans l'option interne active_plugins.

Lors de l'activation d'une extension, plusieurs actions sont déclenchées. $plugin ici représente le chemin relatif au répertoire plugin. Dans notre cas, $plugin = 'myplugin/myplugin.php'

  • action (avant la mise à jour de l'option): activate_plugin($plugin, bool $network_wide)
  • action (avant la mise à jour de l'option): activate_$plugin(bool $network_wide)
  • action (après la mise à jour de l'option): activated_plugin($plugin, bool $network_wide)

Lors de la désactivation de l'extension:

  • action (avant la mise à jour de l'option): deactivate_plugin($plugin, bool $network_deactivating)
  • action (avant la mise à jour de l'option): deactivate_$plugin(bool $network_deactivating)
  • action (avant la mise à jour de l'option): deactivated_plugin($plugin, bool $network_deactivating)

S'amuser avec les actions d'activation

Voici un exemple d'action pour l'activation.

function myplugin_admin_notices() {
    $notices = get_option('myplugin_admin_notices');
    if ($notices) {
        echo $notices;
    }   
    delete_option('myplugin_admin_notices', '');
}
function myplugin_activate_myplugin($network_wide) {
    update_option('myplugin_admin_notices', '<div class="updated">Message lors de l\'activation.</div>');
}

add_action('activate_myplugin/myplugin.php', 'myplugin_activate_myplugin');
add_action('admin_notices', 'myplugin_admin_notices');

Syntaxe objet

class MyPlugin
{
    public function __construct() {
        add_action('activate_myplugin/myplugin.php', array($this, 'activate'));
        add_action('admin_notices', array($this, 'admin_notices'));
    }

    public function admin_notices() {
        $notices = get_option('myplugin_admin_notices');
        if ($notices) {
            echo $notices;
        }   
        delete_option('myplugin_admin_notices', '');
    }
    public function activate($network_wide) {
        update_option('myplugin_admin_notices', '<div class="updated">Message lors de l\'activation.</div>');
    }
}
new MyPlugin();

Note: il faut utiliser une option (update/delete) ou une variable $_SESSION pour l'action 'admin_notices' car il y a une redirection lors de l'activation.

Note: je n'ai pas réussi à faire déclencher l'action 'admin_notices' lors de la désactivation du plugin, par contre l'action 'deactivate_myplugin/myplugin.php' est exécutée.

Ajouter un menu

Pour ajouter un menu, il faut utiliser l'action admin_menu et les fonctions add_menu_page et add_submenu_page.

Menu principal (en dessous des Commentaires, par dessus Apparence):

    public function __construct() {
        add_action('admin_menu', array($this, 'admin_menu'));
    }
    public function admin_menu() {
        add_menu_page('My Plugin', 'My Plugin', 'edit_posts', 'myplugin', array($this, 'menu_action_1'), '', 30);
        add_submenu_page('myplugin', 'Sub Menu 1', 'Sub Menu 1', 'edit_posts', 'myplugin-submenu1', array($this, 'menu_subaction_1'));
        add_submenu_page('myplugin', 'Sub Menu 2', 'Sub Menu 2', 'edit_posts', 'myplugin-submenu2', array($this, 'menu_subaction_2'));
    }
    public function menu_action_1() {
        echo 'abc';
    }
    public function menu_subaction_1() {
        echo 'def';
    }
    public function menu_subaction_2() {
        echo 'ghi';
    }

Pour ajouter un sous-menu dans le menu Réglages (avec les droits administrateurs), il faut écrire:

        add_submenu_page('options-general.php', 'Sub Menu 1', 'Sub Menu 1', 'manage_options', 'myplugin-submenu1', array($this, 'menu_subaction_1'));

Documentation: add_menu_page() et add_submenu_page().

Ajouter un bloc dans le formulaire d'édition d'un article

L'édition d'un article est gérée par les actions: simple_edit_form, edit_form_advanced, edit_post, publish_post et save_post. On peut préciser la position du menu avec le troisième paramètre dans add_action.

La boîte d'édition devrait avoir la classe "postbox" ainsi que le code pour le titre (h3).

    public function __construct() {
        add_action('simple_edit_form', array($this, 'echo_form'), 5);
        add_action('edit_form_advanced', array($this, 'echo_form'), 5);
    }

    public function echo_form() {
        echo '<div class="postbox">';
        echo ' <div class="handlediv" title="Click to toggle"><br></div><h3 class="hndle"><span>Titre du bloc My Plugin</span></h3>';
        echo ' <div class="inside">Intérieur du bloc</div>';
        echo '</div>';
    }

Ajouter un bloc dans le formulaire d'édition d'une page

L'édition d'une page est gérée par les actions: edit_page_form. On peut préciser la position du menu avec le troisième paramètre dans add_action.

La boîte d'édition devrait avoir la classe "postbox" ainsi que le code pour le titre (h3).

    public function __construct() {
        add_action('edit_page_form', array($this, 'echo_form_page'), 5);
    }

    public function echo_form() {
        echo '<div class="postbox">';
        echo ' <div class="handlediv" title="Click to toggle"><br></div><h3 class="hndle"><span>Titre du bloc My Plugin</span></h3>';
        echo ' <div class="inside">Intérieur du bloc</div>';
        echo '</div>';
    }

Autres callback et fonctions

wptexturize('string');

function PLUGIN_css() {
  echo '<style>.mystyle {} </style>';
}

add_action('admin_notices', 'PLUGIN_notices');
add_action('admin_head', 'PLUGIN_css');