Développer un plugin pour WordPress
8 – Suppression et nettoyage
22 octobre 2016.
Le comment du pourquoi
Je l’ai dit et répété tout au long des chapitres précédents façon radoteur saoulant : une extension, c’est bien quand ça fonctionne mais c’est mieux encore quand ça a l’élégance de ne laisser qu’un minimum de traces.
Vous admettrez certainement que le moins que l’on puisse faire pour se conformer à cette règle, c’est de procéder à l’élimination complète de ses traces lorsque l’extension est supprimée.
Pour ce faire, nous allons préventivement affecter une meta-data à chaque article doté d’une image traitée par notre plugin.
Si, par la suite, notre extension vient à disparaître corps et biens, nous n’aurons plus alors qu’à assurer le nettoyage de notre marquage sur tous les posts portant notre meta-data.
Meta-data
La meta-data est affectée ou retirée lors de la sauvegarde de l’article selon que celui-ci contient au moins une image traitée par notre extension… ou pas.
Dans la classe admin/class-text-floating-image-admin.php, nous ajoutons donc la fonction save_post() que voici :
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 |
/** * Affectation/Suppression d'une meta-data sur le post lors de sa sauvagarde * La fonction est appelée sur le hook save_post * dans la fonction define_admin_hooks() de includes/class-text-floating-image.php * * @since 1.0.0 */ function save_post($post_id) { //Récupération du contenu du post $post = get_post($post_id); $content = $post->post_content; //On s'assure qu'il y a quelque chose dans $content //sinon Firefox lève une exception php (mais pas Chrome!) if ($content) { //http://php.net/manual/fr/class.domdocument.php $dom = new DOMDocument(); //http://php.net/manual/fr/domdocument.loadhtml.php $dom->loadHTML($content); $xpathImg = new DOMXPath($dom); //$images est un tableau référençant les images //portant notre attribut 'data-text_floating_image' $images = $xpathImg->query('//img[@data-text_floating_image]'); //Si on a trouvé au moins une image traitée if ($images->length > 0) { //On ajoute une meta-data sur le post //https://codex.wordpress.org/Function_Reference/add_post_meta add_post_meta($post_id, $this->plugin_name, true, true); //Sinon } else { //On supprime l'éventuel meta-data //https://codex.wordpress.org/Function_Reference/delete_post_meta delete_post_meta($post_id, $this->plugin_name); } } } |
On enchaîne sans plus traîner en déclarant le hook dans notre classe includes/class-text-floating-image.php :
241 242 243 244 245 246 247 248 |
/** * Affectation/Suppression d'une meta-data sur le post lors de sa sauvagarde * La fonction save_post se situe dans la classe * admin/class-text-floating-image-admin.php. */ $this->loader->add_action('save_post', $plugin_admin, 'save_post'); |
Incinération
Ne nous reste donc plus qu’à organiser les obsèques. La cérémonie se déroule en toute simplicité dans le fichier uninstall.php qui est logé à la racine de notre projet et que nous avions d’ailleurs déjà eu l’occasion de visiter pour assurer le nettoyage des préférences générales.
Voici la chose dûment complétée pour répondre à nos attentes :
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
// If uninstall not called from WordPress, then exit. if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { exit; } else { //On supprime de la table wp_options de la base de données de Wordpress //la ligne text-floating-image chargée de stocker les valeurs par défaut //et les paramètres utilisateur delete_option( 'text-floating-image' ); //Construction de l'argument de notre WP_Query //Il s'agit de trouver tous les posts portant une meta 'text-floating-image' //https://codex.wordpress.org/Class_Reference/WP_Query $args = array( 'post_type' => 'any', 'meta_query' => array( array( 'key' => 'text-floating-image', ) ), ); $the_query = new WP_Query($args); if ($the_query->have_posts()) { while ($the_query->have_posts()) { $the_query->the_post(); //http://php.net/manual/fr/class.domdocument.php $dom = new DOMDocument(); //http://php.net/manual/fr/domdocument.loadhtml.php //Voir en particulier la première contribution pour une explication //quant à 'xml encoding="utf-8"' $dom->loadHTML('<?xml encoding="utf-8" ?>'.get_the_content());//Pour conserver le bon encodage //http://php.net/manual/fr/class.domxpath.php $xpathElt = new DOMXPath($dom); //On recherche activement tous les éléments portant l'attribut //'data-text_floating_image' $elements = $xpathElt->query('//*[@data-text_floating_image]'); foreach($elements as $element) { //On nettoie chacun des éléments trouvés des attributs posés par notre extension $element->removeAttribute('data-text_floating_image-style'); $element->removeAttribute('data-text_floating_image-after'); $element->removeAttribute('data-text_floating_image'); } //On sauve proprement notre travail dans une variable $html //http://php.net/manual/fr/domdocument.savehtml.php //Voir en paticulier la première contribution pour une explication //quant à 'preg_replace' $html = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<?xml encoding="utf-8" ?>','<html>', '</html>', '<body>', '</body>'), array('', '', '', '', ''), $dom->saveHTML())); //On update le post $my_post = array( 'ID'=> get_the_ID(), 'post_content' => $html, ); wp_update_post($my_post); //Et on supprime son post-meta delete_post_meta(get_the_ID(),'text-floating-image'); } } } |
Petit rappel d’importance : Avant que de vous précipiter vous assurer de la validité de la chose en supprimant l’extension comme ça pour voir, n’oubliez pas de faire un back-up du dossier text-floating-image au risque de perdre tout votre travail : WordPress ne fait pas de détail et détruit sans complexe mais à raison le dossier d’une extension lorsque celle-ci est supprimée !
Conclusion
Vous savez quoi ?… Il semble bien que nous soyons arrivé au terme de notre périple…
Il semble… Mais rien n’est moins sûr.
Il est en effet certain que l’expérience et la pratique nous amèneront à découvrir au fil du temps autant d’imperfections à corriger que d’améliorations à apporter, ainsi que j’ai déjà pu le constater par moi-même à maintes reprises tout au long de la rédaction de ces articles.
L’informatique demeure encore et toujours une école d’humilité et de modestie. C’est quand on croit avoir penser à tout qu’on découvre qu’au final, ce tout est autrement plus complexe qu’on avait pu l’envisager.
Et je trouve ça très bien ainsi : comme dans la vie, nous ne sommes jamais au bout de nos surprises. C’est bien là ce qui fait le sel de l’existence, même si ce sel peut parfois prendre des relents poivrés…
Quoi qu’il en soit, ceux qui le désirent peuvent se saisir ici du projet dans son ensemble et dans l’état actuel de sa gestation. Il est en tout cas suffisamment opérationnel pour assurer sur ce blog la gestion de la plupart des images…