Rapport de stage, partie 2.

4.LA MISSION

Ma première et ma plus grosse mission était de créer une fonction d’import qui ira chercher un fichier .csv contenant une centaine de films afin de les enregistrer dans notre base de données.
Le fichier ressemblait à ça :
csv

A la vue de cette abomination, j’ai d’abord pleuré toutes les larmes de mon corps avant de me souvenir qu’il était possible de la convertir (notamment) en fichier Excel. Après modification, voilà le fichier d’import : csvmodif

Déjà mieux !

Le fichier contient plus de 40 colonnes, chaque colonne contient un attribut, ils sont parfois « homogènes » parfois non. Par exemple, certains noms composés sont parfois écrits avec une séparation « - » d’autres avec un « | » voir simplement un espace. Parfois, les mots contiennent un espace à la fin, parfois avant.

En gros les données sont « raw », contiennent parfois des fautes de frappes et il va falloir en plus de les envoyer dans la BDD, les « nettoyer ».
Comme souvent en programmation, il vaut mieux se concentrer sur un problème à la fois, construire petit à petit. J’ai choisi de commencer ma fonction d’import en me focalisant dans un premier temps sur :

  1. Le titre (post_name)
  2. Le contenu, la description du film (post_content)

Avant toute chose, je tiens à préciser que lors de mon arrivée au BIFFF, un stagiaire était déjà présent, Ahmed.

Ahmed, ce sacré polisson, avait au préalable créer tous les fields où allaient finir les données que ma fonction allait catapulter à pleine puissance.

Petit exemple de quelques fields pour le post « Films »

Partie 1 : La découverte

Petit résumé d’où j’en suis :

  • Mes fields sont créés (merci Ahmed).
  • Mon fichier d’import est lisible, bien qu’en désordre total.
  • J’ai aucune idée de comment intégrer une nouvelle fonction à un WordPress. Du coup me voici sur Google, premier jour de stage, un peu perdu face à cette mission et avec cette envie de faire bonne impression. Je commence par tenter d’afficher un bouton dans l’admin de WordPress en passant par le fichier functions.php (merci Google). J’en aurai besoin par la suite pour déclencher la fonction d’import. Après pas mal de chipotage et de ratés, je parviens à l’afficher : boutoninsert

Le code :

codeboutoninsert

Victoire !

La première brique est posée, le $_SERVER[‘REQUEST_URI‘] va me chercher l’url courante et le $insertion_csv_post sera rajouter à la fin de l’url, ce qui va me permettre plus tard d’utiliser ce système afin de poursuivre l’exécution de ma fonction si $insertion_csv_post est présent dans l’url. Ou inversement, ne pas poursuivre son exécution si ma variable $_POST est absente, dans le but de ne pas gâcher de la mémoire pour rien.
Je savoure brièvement cette première victoire et repars sur Google à la recherche d’une fonction d’import qu’un petit génie aurait éventuellement déjà codé à ma place, et où je n’aurais plus qu’à faire un glorieux ctrl+c, ctrl+v afin que tous mes soucis disparaissent. Voir, qu’émerveillé, mon maître de stage me propose instantanément un CDI et qu’il me mette en contact avec Jeff Bezos. Du coup à ce stade, mon historique Google devait ressembler à ça :

histogoogle
C’est avec beaucoup d’amertume et de déception que je me rendis compte que j’étais un des seuls illuminés sur terre à vouloir coder cette fonction à la main, que tout le monde utilisait des plugins à 5€ codés par Râmakrishna Paramahamsa ou son collègue Wang Zhang Jing.
Plein d’espoir, je contacte JD afin de lui faire part de ma découverte de plugins d’import, dont certains avec plus de 5 millions d’utilisateurs.

Mais JD est un homme libre et il a une autre idée en tête :

JDdiscord

Ne dit-on pas que la liberté n’a pas de prix ?

Partie 2 : La Révélation

Déçu de la tournure de ma négociation avec JD, je relance mon éditeur de code et retourne dans functions.php.
Soudainement, j’ai un flashback : une cascade, moi en tenue traditionnelle japonaise, en équilibre sur un pied sur un rondin de bois. Une voix marquée par un accent Louviérois arrive jusqu'à mes oreilles :
« Variable globale… »
Wow. Bien vu.
J’initialise $wpdb en global afin de pouvoir, dans un futur proche, exécuter une custom database query dessus. Je crée le test afin de vérifier si le bouton a été cliqué ou non, et j’initialise mon tableau qui contiendra plus tard toutes mes données :
globalwpbd

J’exécute ensuite ma query sur la base de donnée :

functionwp

Un petit var_dump sur $posts afin de vérifier si tout s’est bien passé :

vardump

Bingo. On peut passer à la suite.

Partie 3 : L’insertion

Maintenant que j’ai accès aux données du .csv, « yapluka » les insérer au bon endroit.

Je décide d’abord de modifier mon fichier .csv pour ne garder que les 4 premiers films sur les 200+. Cela va rendre mes tests plus faciles et va m’éviter également de surcharger la BDD pour rien.

Une fois le .csv modifié, je vais pour l’instant comme je l’ai dit plus tôt, n’insérer que le nom et la description du film.
Première chose à faire, un test sur les doublons. Si le titre du film existe déjà, on passe au suivant. Rien de pire que de surcharger une base de donnée avec des affreux doublons. Ça donne ceci :
doubloncheck

Ensuite, l’insertion en elle-même. Wordpress possède un grand nombre de fonctions qui lui sont propres, notamment wp_insert_post que je vais utiliser ici :
wpinsertpost

On fait l’update des fields titre et description :
update_field

Et après avoir cliqué sur mon petit bouton d’insertion :
wp_insertion_films

L’insertion fonctionne !

Cette partie était la plus simple, car les fields « titre » et « content » sont des fields Text.
J’ai rencontré beaucoup plus de difficultés lors de l’import des « genres » par exemple. Dans le WordPress, les genres sont une taxonomie. De plus, j’ai remarqué que certains genres dans le fichier .csv avaient besoin d’être nettoyés.

Petit exemple de ce que donne le code d’import des genres :

genreexplode
Au final, malgré les difficultés j’ai tout de même réussi à tout importer. Rien que cette fonction d’import m’a pris je pense plus de 3 semaines afin qu’elle soit complètement opérationnelle.

Je n’ai pas travaillé à temps plein dessus, car d’autres missions venaient se greffer simultanément, comme la création d’une ligne du temps qui reprend les 40 années d’éditions du BIFFF, des carrousels qui affichent les différents films, triés par genre, des rewrites rules, une homepage, etc.

Ligne du temps des éditions
La homepage

24