Deux façons de développer des plugins WordPress Programmation fonctionnelle

Cette deuxième partie d'une série examine deux styles de programmation différents (parfois appelés paradigmes de programmation) que vous pouvez utiliser lorsque vous écrivez des plug-ins WordPress. Dans la première partie, Tom McFarlin a abordé la programmation orientée objet. Dans cette partie, nous examinerons la programmation fonctionnelle.

Comme le niveau d'expérience des lecteurs varie, nous allons parler de programmation de haut niveau. Si vous êtes débutant, vous ne devriez pas avoir de problème à vous suivre. Si, toutefois, vous êtes un développeur plus expérimenté, vous pourrez trouver d'autres informations utiles plus tard dans l'article..


Qu'est-ce que la programmation fonctionnelle?

La programmation fonctionnelle est probablement le style avec lequel vous êtes le plus familier - et presque universellement - est le style utilisé dans les différents sites Web d'extraits de code WordPress flottant autour d'Internet. Pour cette raison, il peut parfois être considéré comme une programmation «d'entrée de gamme»: le style employé par les débutants jusqu'à ce qu'ils aient appris à maîtriser la programmation orientée objet. Ceci est incroyablement trompeur, car bien que la programmation fonctionnelle soit beaucoup plus simple, elle n’est pas en soi inférieure..

La programmation fonctionnelle met l'accent sur l'évaluation des fonctions et évite la notion d'états ou d'objets par opposition à la programmation orientée objet qui encourage la réflexion sur le code comme agissant sur un ou plusieurs objets, en utilisant des méthodes pour modifier ces objets ou interagir avec eux. Regardons un exemple très simple comparant les deux styles:

 // Méthode fonctionnelle function add_two ($ n) return $ n +2;  $ a = 2; $ b = add_two ($ a); // $ b = 4; // Méthode orientée objet numéro de classe var $ value = 0; fonction __construct ($ a) $ this-> value = $ a;  function add_two () $ this-> value = $ this-> value +2;  $ a = nouveau numéro (2); echo $ a-> valeur; // Imprime 2 $ a-> add_two (); echo $ a-> valeur; // impressions 4

Cet exemple très simple illustre la différence fondamentale de style entre les deux paradigmes: la programmation fonctionnelle consiste à transmettre des arguments à des fonctions et à en recevoir des valeurs. Il n'y a pas d '"objets" sur lesquels on agit, il n'y a que des paramètres et des valeurs de retour. Inversement, l'approche orientée objet attribue à un objet différentes propriétés (dans notre cas une "valeur") et les méthodes agissent sur ces propriétés..


Fonctions: les bases

Définir des fonctions est très simple:

 function add ($ number, $ number2 = 1) // Exécute le code en agissant sur les variables passées $ sum = $ number + $ number2; // Facultatif, si nécessaire, vous pouvez retourner une valeur return $ sum; 

Une fois la fonction déclarée, elle peut être utilisée n’importe où dans votre plug-in - en d’autres termes, elle a une portée globale..

 $ a = 4; $ b = 7; echo add ($ a, $ b); // impressions 11
Les fonctions doivent avoir des noms uniques. Redéclarer une fonction provoquera une erreur. Étant donné que votre code fonctionnera aux côtés d'autres plug-ins, thèmes et WordPress lui-même, vous ne devez jamais utiliser de noms génériques. Au lieu de cela, vous devriez préfixer vos noms de fonctions avec quelque chose d'unique (comme le nom de votre plug-in).

Vous avez peut-être remarqué que dans la définition de ajouter, le deuxième argument est égal à 1. Ceci définit une valeur par défaut pour $ number2 (dans ce cas, 1), ce qui rend l'argument facultatif. Si l'argument n'est pas fourni, la valeur par défaut est la suivante:

 echo add (4); // Imprime 5 echo add (4, 1); // impressions 5

D'autre part, aucune valeur par défaut n'est fournie pour la première valeur, donc omettre cet argument génèrera une erreur.

 echo add (); // Lance une erreur car $ number n'est pas défini

Vous pouvez également avoir un nombre variable d'arguments. Dans la fonction, nous pouvons utiliser func_num_args () pour obtenir le nombre d'arguments reçus, alors que func_get_arg () vous permet d'accéder à une variable passée, indexée à partir de 0.

 function sum () // Récupère le nombre d'arguments donnés à sum () $ number_args = func_num_args (); $ somme = 0; if (! $ number_args) retourne $ somme; pour ($ i = 0; $ i < $number_args; $i++ )  $sum += func_get_arg( $i );  return $sum;  echo sum( 1, 2, 3, 4 ); //Prints 10 echo sum( 1, 2 ); //Prints 3 echo sum(); //Prints 0

Ce qui précède peut également être utilisé dans les méthodes d'objet. Enfin, en déclarant une variable comme 'globale', vous pouvez accéder à la variable de l'intérieur d'une fonction.

 $ a = 'Bonjour'; $ b = 'Monde'; function hello_world () // Ceci est nécessaire pour accéder à $ a et $ b // déclarés en dehors de la portée de la fonction. global $ a, $ b; $ b = $ a. ". $ b; hello_world (); echo $ b; // affiche 'Hello World'
L'utilisation de globals est généralement déconseillée. D'autant plus que deux plug-ins utilisant le même nom pour une variable globale peuvent provoquer la rupture d'un ou des deux plug-ins. Si vous devez utiliser une variable globale, assurez-vous qu'elle est unique en préfixant le nom de votre plug-in..

Pourquoi utiliser la programmation fonctionnelle?

Le choix du style de programmation à utiliser dépend du jugement - et oui - des préférences personnelles. Il n’est ni plus ni moins bon d’utiliser une programmation fonctionnelle par rapport à la programmation orientée objet, mais le plus souvent, il existe un style qui convient mieux à ce que vous essayez d’atteindre..

Parfois, la programmation orientée objet n’est tout simplement pas nécessaire et ne fait que compliquer les choses ou introduire du code superflu. Un exemple pourrait être les diverses fonctions «utilitaires» fournies par WordPress. Ce sont des fonctions génériques qui servent à accomplir un but particulier. Par exemple wp_trim_words ($ text, $ num_words) coupe simplement la chaîne donnée à une certaine taille (en mots). Il n'ajouterait rien pour définir wp_trim_words () à la place, en tant que méthode appartenant à un objet, et aboutirait à un code plus laid. Avec la programmation fonctionnelle, il faut une ligne.

L'un des avantages de la programmation fonctionnelle, en particulier pour les débutants, est sa simplicité. Vous n'avez pas à vous soucier des fonctions statiques, privées ou protégées - elles sont toutes globales. La notion de variables statiques n'existe pas non plus. Au niveau de base, votre fonction renvoie un résultat dérivé de ce que vous lui avez donné. Par exemple, get_the_title (7) renverra le titre de l'article avec l'ID 7.

Un autre avantage de la programmation fonctionnelle est que les fonctions sont accessibles globalement. Avec les programmes orientés objet, pour agir sur un objet spécifique, vous devez le faire passer. Cela peut parfois être délicat. Pour illustrer cela, prenons un exemple de la première partie:

 class DemoPlugin fonction publique __construct () add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_scripts'));  fonction publique register_plugin_scripts () // Enregistrer les scripts de plug-in $ demo_plugin = new DemoPlugin ();

Lorsque WordPress stocke le register_plugin_scripts () méthode afin qu'il puisse être appelé lorsque le wp_enqueue_scripts l'action est déclenchée, elle le fait en référençant non seulement la méthode, mais également l'objet $ demo_plugin. En effet, la même méthode pour différentes instances d’un objet est considérée différent méthodes - c'est, $ demo_plugin-> register_plugin_scripts () et $ copy_of_demo_plugin-> register_plugin_scripts () ne sont pas les mêmes. Cela peut sembler étrange - mais les méthodes peuvent se comporter différemment pour différentes instances de la même classe. Nous devons donc référencer à la fois la méthode et l’instance..

Mais pourquoi est-ce important? Il est très difficile pour un plug-in ou un thème tiers de décrocher cette méthode, car pour ce faire, ils doivent appeler:

 remove_action ('wp_enqueue_scripts', array ($ demo_plugin, 'register_plugin_scripts'));

Mais en général, ils n’auront pas accès à la $ demo_plugin variable. (Remarque: si la méthode est déclarée statique, vous pouvez contourner ce problème).


Programmation fonctionnelle et fonctionnelle dans WordPress

Bien entendu, la programmation orientée objet a ses avantages, comme indiqué dans la première partie. Comme Tom l'a également mentionné, il est inévitable d'utiliser l'API de widget de WordPress. Un autre exemple courant est WP_Query (). Ici, une approche orientée objet est clairement la meilleure: vous avez un objet (dans ce cas une requête), qui possède différentes propriétés (critères de recherche, informations de pagination, résultats correspondants) et vous souhaitez agir sur cette requête (l’analyser, la générer). et désinfecter le code SQL correspondant et renvoyer les résultats).

WP_Query () démontre à quel point la programmation orientée objet peut être puissante lorsqu'elle est utilisée correctement. Après avoir lancé la requête:

 $ the_query = new WP_Query (array (…));

Vous pouvez non seulement accéder aux résultats, mais également à d'autres informations telles que les valeurs de pagination: le nombre de pages de résultats, la page affichée, le nombre total de résultats et le "type" de requête, par exemple.. $ the_query-> is_search (), $ the_query-> is_single () etc. Il y a aussi toute l'infrastructure «en boucle»;

 if ($ the_query-> have_posts ()) echo '
    '; while ($ the_query-> have_posts ()): $ the_query-> the_post (); // La boucle echo '
  • '. get_the_title ($ the_post-> ID). '
  • '; en attendant; écho '
'; wp_reset_postdata ();

Ce qui cache tout le jonglage interne des résultats et des globaux derrière une API conviviale.

Alors qu'en est-il get_posts ()? Cela sert juste de wrapper pour WP_Query (), et renvoie simplement un tableau de messages correspondant à la requête. En tant que tel, vous ne recevez pas les "cloches et sifflets" de WP_Query (), mais c'est un peu plus efficace. Donc, si vous devriez utiliser get_posts () ou WP_Query () dépend de votre cas d'utilisation (par exemple, si vous avez besoin d'une pagination ou non), mais cela dépend aussi de vos préférences personnelles.

 $ results = get_posts (array (…)); if ($ résultats) echo '
    '; foreach ($ résultats sous la forme $ the_post) echo '
  • '. get_the_title ($ the_post-> ID). '
  • '; écho '
';

Résumé

Espérons que ces deux articles ont permis de mettre en évidence les avantages et les inconvénients de ces styles de programmation. Ce qu'il faut retenir, c'est qu'il n'y a pas de juste ni de faux ici et que chaque programmeur aura ses préférences personnelles. Mais certains contextes se prêtent plus facilement à un certain style de programmation - et en tant que tel, vous devez vous attendre à ce que votre plug-in contienne un mélange des deux..