
Hello tout le monde, comme vous le savez sûrement, WordPress est aujourd’hui une référence dans le monde des CMS. J’ai commencé à développer des plugins depuis peu de temps (environ 6 mois) et je dois dire que les outils proposés par WordPress nous facilitent grandement la tâche. Dans ce tuto, nous verrons donc comment développer un plugin […]
Hello tout le monde,
comme vous le savez sûrement, WordPress est aujourd’hui une référence dans le monde des CMS.
J’ai commencé à développer des plugins depuis peu de temps (environ 6 mois) et je dois dire que les outils proposés par WordPress nous facilitent grandement la tâche.
Dans ce tuto, nous verrons donc comment développer un plugin WordPress de A à Z. Et histoire de pimenter un peu les choses, j’ai décidé de développer un plugin orienté SEO (assez basique mais permettant de bien comprendre les bases).
En effet, ce plugin nous permettra :
– De changer automatiquement le titre des pages en fonction du nombre de recherche Goolgle sur une expression (grâce au referer). Ainsi, le titre correspondra à l’expression la plus recherchée pour atterir sur notre site
– De consulter ces expressions ainsi que le nombre de recherches
Vous pouvez récupérer le plugin ici : http://www.devandseo.fr/wp-modiftitle.rar
A priori, celui-ci fonctionne mais vu que je l’ai codé un peu rapidement, ça ne m’étonnerait pas qu’il y ait quelques bugs (Si vous avez un souci, c’est par ici pour me contacter)
C’est parti …
Détection Google
Lorsqu’un visiteur arrive sur le site, il nous faut détecter si celui-ci provient de Google, et si oui, quelle est la requête qu’il a tapée.
Voici donc la fonction qui nous permet de faire cela :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function checkGgKeyword() { $referer = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : false; if (!$referer) return false; // if google if (strpos($referer, "google")) { $keyword = substr($referer, strpos($referer, "q=")); $keyword = substr($keyword, 2); if (strpos($keyword, "&")) $keyword = substr($keyword, 0, strpos($keyword,"&")); if (empty($keyword)) return false; return strtolower(trim(urldecode($keyword))); } return false; } |
Structure du plugin
La structure du plugin est la suivante :
– wp-content/plugin/wp-modiftitle/
– wp-content/plugin/wp-modiftitle/lang : les fichiers de traduction
– wp-content/plugin/wp-modiftitle/readme.txt : ce fichier est obligatoire seulement si le plugin est publié
– wp-content/plugin/wp-modiftitle/wp-modiftitle.php : fichier principal
– wp-content/plugin/wp-modiftitle/css
– wp-content/plugin/wp-modiftitle/php
– wp-content/plugin/wp-modiftitle/js
Fichier principal
Le fichier principal de votre plugin devra contenir les entêtes suivantes :
1 2 3 4 5 6 7 8 |
/* Plugin Name: Nom du plugin Plugin URI: URL de l’article présentant le plugin Description: la description Version: la version Author: l'auteur Author URI: l'url de la page de présentation de l'auteur */ |
Notre classe principale
On va ensuite créer la classe principale de notre plugin et déclarer une nouvelle instance de cette classe :
1 2 3 4 5 6 7 8 9 |
class modifTitle { function __construct() { // vide pour l'instant } } $modifTitleInstance = new modifTitle(); |
Les actions
Les actions sont des fonctions qui seront appelées lors d’événements particuliers. Par exemple, grâce à ces fonctions, on pourra changer le titre de la page lors du chargement de la section head (tiens ça tombe bien, c’est à ça que sert notre plugin non ?).
La liste des actions disponibles se trouve ici : Actions WordPress
Ajouter une action
Pour ajouter une action, c’est très simple, il suffit d’appeler la fonction suivante :
add_action($tag, $function_to_add, $priority, $accepted_args );
Concernant les paramètres :
– $tag (string) est nom de l’action sur laquelle on veut se brancher
– $function_to_add est la fonction à appeler
Pour voir les paramètres en détail, c’est par ici : add_action
Donc nous, nous allons créer une nouvelle action :
1 |
add_action('wp_head', array(&$modifTitleInstance, 'modifyTitle')); |
Ainsi, lors du chargement de la section head, la fonction ‘modifyTitle’ (dont nous verrons le code plus tard) sera appelée.
Supprimer une action
Pour supprimer une action, c’est tout aussi simple (les paramètres sont identiques à la fonction ‘add_action’) :
remove_action( $tag, $function_to_remove, $priority, $accepted_args );
Les filtres
Les filtres jouent un rôle important également car ce sont grâce à eux que l’on va modifier le contenu du site.
On pourra par exemple ajouter du texte à la fin de chaque article, modifier la position de certains éléments, etc..
Pour voir la liste des filtres disponible, c’est par ici : Filtres WordPress
Ajouter un filtre
L’ajout de filtre se fait très simplement, il suffit d’appeler la fonction add_filter (encore une fois, les paramètres ne changent pas) :
add_filter($tag, $function_to_add, $priority, $accepted_args );
Pour notre plugin, nous n’utiliserons pas cette fonction.
Mais par exemple, pour ajouter « J’adore le SEO » à la fin de chaque article, il suffit de faire comme cela :
1 2 3 4 5 |
function addText($content = '') { $content .= "J'adore le SEO" ; return $content ; } |
Le filtre à utiliser pour l’affichage des articles est ‘the_content’. On le branche alors à notre fonction addText :
1 |
add_filter('the_content', array(&$modifTitleInstance, 'addText')); |
Modification du Header
Pour ajouter des fichiers CSS ou JSS dans notre header, on aurait pu utiliser les actions, mais cela pose certains problèmes (fichiers dupliqués, etc..)
Mais WordPress nous fourni des fonctions toutes prêtes, alors autant ne pas s’en priver.
Javascript
Certaines bibliothèques sont fournies avec WordPress; il suffit alors d’appeler la fonction ‘wp_enqueue_script’ avec le nom de la bibliothèque pour l’inclure :
1 |
wp_enqueue_script('jquery'); |
Si vous souhaitez inclure vos propres fichiers, rien de plus simple :
1 |
wp_enqueue_script('wp_modiftitle', '/wp-content/plugins/wp-modiftitle/js/functions.js') ; |
CSS
Pour charger vos fichiers CSS, WordPress a prévu la fonction ‘wp_enqueue_style’ :
1 |
wp_enqueue_style('wp_modiftitle', '/wp-content/plugins/wp-modiftitle/css/main.css') ; |
Administration
Vous le savez sûrement déjà, mais l’espace d’administration joue un rôle clé puisqu’il vous permettra de régler différents paramètres.
WordPress nous fourni un mécanisme puissant pour stocker toutes ces valeurs : les options.
Déclaration des options
Vos options devront être uniques et déclarées en tant qu’attribut de votre classe :
1 2 3 4 5 6 7 |
class modifTitle { var $myOptions = 'wp_modifTitleOptions'; function __construct() { } } |
La page d’administration
Concernant notre plugin, on veut affichée la liste des recherches Google qui ont mené vers notre site, avec le nombre d’occurence(s) et la date de recherche.
On va donc créer cette fonction qui va afficher les données:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/** * @global $wpdb; **/ function displayPageAdmin() { global $wpdb; $tableName = $wpdb->prefix . 'modiftitle'; $sql = 'SELECT * FROM `' . $tableName . '` ORDER BY occurence DESC'; $sql = $wpdb->prepare($sql); $result = $wpdb->get_results($sql); if (count($result) == 0) { echo '<p>Aucune expression cherchée</p>'; } else { echo '<table border="1" style="padding : 10px">'; echo '<thead><tr><th style="padding: 10px;">Expression</th><th style="padding: 10px;">Nombre d\'occurence(s)</th>'; echo '<th style="padding: 10px;">Dernière recherche</th></tr></thead>'; foreach ($result as $data) { echo '<tr>'; echo '<td style="text-align : center;">' . esc_attr(ucfirst($data->keyword)) . '</td>'; echo '<td style="text-align : center;">' . $data->occurence . '</td>'; echo '<td style="text-align : center;">' . $data->date_search . '</td>'; echo '</tr>'; } echo '</table>'; } } |
Il va donc falloir appeler cette fonction. On va tout d’abord créer un nouvel onglet dans le menu réglage (Configuration). On appelle pour cela la fonction ‘add_options_pages’ :
1 2 3 4 5 6 7 8 9 |
if (!function_exists('displaySearchResult')) { function displaySearchResult() { global $modifTitleInstance; add_options_page('Administration', 'ModifTitle', 9, basename(__FILE__), array(&$modifTitleInstance, 'displayPageAdmin')); } } |
A noter que la fonction qui sert à appeler la fonction ‘add_options_page’ doit se trouver à l’extérieur de notre classe principale.
On branche ensuite cette fonction afin qu’elle soit appelée lors du chargement du menu :
1 |
add_action('admin_menu', 'displaySearchResult'); |
Base de données
On pourrait stocker les données dans les options, mais de un c’est moche, et de deux, les plugins ont généralement besoin de leur propre structure.
On préfère alors utiliser la base de données.
Installation de la base de données
Lors de l’installation du plugin, il va falloir créer nos tables. L’objet $wpdb permet de manipuler la base de données.
On écrit donc la fonction chargée de créer nos tables (dans notre cas, nous avons besoin que d’une seule table) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/** * @global $wpdb; **/ function installDB() { global $wpdb; $tableName = $wpdb->prefix . 'modiftitle'; $sql = "CREATE TABLE `" . $tableName . "` ("; $sql .= "`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,"; $sql .= "`keyword` VARCHAR( 150 ) NOT NULL ,"; $sql .= "`occurence` INT NOT NULL ,"; $sql .= "`date_search` DATETIME NOT NULL)"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); // Vérifie la structure de la table (check si on doit supprimer ou mettre à jour les tables) dbDelta($sql); // Définie la version des tables (en vue d'une mise à jour par exemple) add_option('modiftitle_db_version', '1.0'); } |
Il suffit d’appeler cette méthode lors de l’installation du plugin. Cela se fait grâce à la fonction ‘register_activation_hook’ :
1 |
register_activation_hook(__FILE__, array(&$modifTitleInstance, 'installDb')); |
Désinstallation de la base de données
Il est utile de supprimer les tables crées lors de la désinstallation du plugin :/**
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * @global $wpdb; **/ function uninstallDB() { global $wpdb; $tableName = $wpdb->prefix . 'modiftitle'; $sql = "DROP TABLE `" . $tableName . "`"; $wpdb->query($sql); delete_option('modiftitle_db_version'); } |
On appelle maintenant la bonne fonction :
1 |
register_deactivation_hook(__FILE__, array(&$modifTitleInstance, 'uninstallDB')); |
Utilisation des données
Si vous avez lu ce tuto attentivement, vous avez remarqué que dans la méthode ‘displayPageAdmin’, nous utilisons ce code :
1 2 3 4 |
$tableName = $wpdb->prefix . 'modiftitle'; $sql = 'SELECT * FROM `' . $tableName . '` ORDER BY occurence DESC'; $sql = $wpdb->prepare($sql); $result = $wpdb->get_results($sql); |
Nous allons maintenant l’expliquer (bien que ce soit tout simple) :
1) La méthode ‘prepare’ sert à protéger les requêtes
2) Comme son nom l’indique, la méthode ‘get_results’ sert à récupérer les résultats de la requêtes en paramètre
Nous allons ensuite créer la fonction qui va se charger d’insérer en base de données la requête tappée par le visiteur sur Google.
A chaque insertion en base, on met à jour l’option pour stocker l’expression qui a été la plus recherchée.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/** * @global $wpdb; **/ function insertKeyword() { global $wpdb; $keyword = $this->checkGgKeyword(); if ($keyword) { global $wpdb; $tableName = $wpdb->prefix . 'modiftitle'; // Check if we have an existing row $sql = 'SELECT occurence FROM `' . $tableName . '` WHERE lower(keyword) = "' . $keyword . '"'; $occurence = $wpdb->get_var($sql); if ($occurence) { $sql = 'UPDATE `' . $tableName . '` SET occurence = occurence + 1, date_search = "' . date('Y-m-d H:i:s') . '"'; $sql .= ' WHERE keyword = "' . $keyword . '"'; $wpdb->query($sql); } else { $sql = 'INSERT INTO `' . $tableName . '` (keyword, occurence, date_search)'; $sql .= ' VALUES ("' . $keyword . '", 1, "' . date('Y-m-d H:i:s') . '")'; $wpdb->query($sql); } // On récupère l'expression la plus recherchée $tableName = $wpdb->prefix . 'modiftitle'; $sql = 'SELECT keyword FROM `' . $tableName . '` WHERE occurence >= (SELECT MAX(occurence) FROM `' . $tableName . '`)'; $sql = $wpdb->prepare($sql); $result = $wpdb->get_results($sql); // if several keyword have same occurences => random if (count($result) > 0) { $keyword = esc_attr(ucfirst($result[rand(0, count($result) - 1)]->keyword)); $options = get_option($this->myOptions); // Et on met à jour l'option $options['keyword'] = $keyword; update_option($this->myOptions, $options); } } } |
On appelle cette fonction à chaque chargement de page :
1 |
add_action('wp_head', array(&$modifTitleInstance, 'insertKeyword')) |
Ensuite, à chaque chargement de page, on met à jour le titre en fonction de l’option précédemment définies (dans la fonction insertKeyword).
On crée d’abord la fonction :
1 2 3 4 5 6 |
function modifyTitle() { $options = get_option($this->myOptions); if (!empty($options['keyword'])) update_option('blogname', $options['keyword']); } |
On appelle cette fonction à chaque chargement de page :
1 |
add_action('wp_head', array(&$modifTitleInstance, 'insertKeyword')); |
Conclusion
Ce que nous avons vu dans cet article représente une petite partie de toutes les possibilités offertes par WordPress.
Pour plus d’informations sur le sujet, vous pouvez consulter la Documentation officielle de WordPress
One Response
Ton tutoriel est vraiment génial . C’est le 1er qui explique pas à pas et qui soit aussi complet . Merci beaucoup , ton article me sera très utile