{"id":229315,"date":"2022-11-01T14:03:00","date_gmt":"2022-11-01T11:03:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229315"},"modified":"2022-11-09T06:26:58","modified_gmt":"2022-11-09T03:26:58","slug":"filtrer-correctement-le-contenu-des-publications-et-comprendre-apply_filters","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/filtrer-correctement-le-contenu-des-publications-et-comprendre-apply_filters\/","title":{"rendered":"Filtrer correctement le contenu des publications (et comprendre apply_filters)"},"content":{"rendered":"\n<p>De temps en temps, chaque fois que je travaille avec du code source pr\u00e9existant ou que j&rsquo;effectue un audit de code, je vois d&rsquo;autres personnes modifier le contenu de la publication d&rsquo;un objet de publication <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-00-my_content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comme celui<\/a> -ci\u00a0:<\/p>\n<pre><code>&lt;?php\n\n$post-&gt;post_content = $my_content;\n<\/code><\/pre>\n<p>\u00c0 ce stade, certains viendront et diront imm\u00e9diatement que vous vous trompez. Je d\u00e9teste cette phrase (et elle est m\u00eame jonch\u00e9e dans la base de code WordPress, mais je m&rsquo;\u00e9loigne du sujet).<\/p>\n<p>Il existe des moyens d&rsquo;utiliser d&rsquo;autres fonctions API WordPress existantes pour nettoyer les donn\u00e9es avant de les d\u00e9finir \u00e9gales \u00e0 la valeur de l&rsquo; attribut <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Post\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">post_content<\/a>, l&rsquo;utilisation de ces fonctions n&rsquo;est pas la meilleure fa\u00e7on de proc\u00e9der.<\/p>\n<p>Au lieu de cela, nous devrions tous utiliser apply_filters. Le probl\u00e8me? Certains ne savent pas, certains ne savent pas comment cela fonctionne, et certains ne savent pas comment l&rsquo;utiliser. C&rsquo;est-\u00e0-dire qu&rsquo;il n&rsquo;est pas clair comment filtrer correctement le contenu des publications.<\/p>\n<p>Contenu brut filtr\u00e9 par WordPress puis \u00e9crit dans la base de donn\u00e9es.<\/p>\n<p>Mais pour ceux qui peuvent appartenir \u00e0 l&rsquo;une des cat\u00e9gories ci-dessus, cela peut peut-\u00eatre aider.<\/p>\n<h2>Filtrer correctement le contenu des publications<\/h2>\n<p>\u00c0 ce stade, je suppose que vous connaissez <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Post<\/a>, ses propri\u00e9t\u00e9s et comment les modifier via diverses fonctions API.<\/p>\n<p>Le principal probl\u00e8me dont je parle est de s&rsquo;assurer que le contenu qui sera \u00e9crit dans la base de donn\u00e9es est format\u00e9 de la m\u00eame mani\u00e8re que WordPress le ferait si vous deviez \u00e9crire ou mettre \u00e0 jour un article.<\/p>\n<p>Et la fa\u00e7on dont cela se passe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-03-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">est la suivante<\/a> (et nous verrons bient\u00f4t les d\u00e9tails \u00e0 ce sujet):<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = apply_filters( 'the_content', $new_content );\n<\/code><\/pre>\n<p>Mais les questions de savoir ce que fait cette fonction, comment elle fonctionne et quand l&rsquo;utiliser demeurent.<\/p>\n<h3>Qu&rsquo;est-ce que apply_filters\u00a0?<\/h3>\n<p>Bien s\u00fbr, vous pouvez tout lire \u00e0 ce sujet dans les ressources pour d\u00e9veloppeurs, et cela donne <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cette d\u00e9finition<\/a> :<\/p>\n<blockquote>\n<p>Appelez les fonctions ajout\u00e9es \u00e0 un hook de filtre.<\/p>\n<\/blockquote>\n<p>Mais cela n&rsquo;aide pas toujours. Je veux dire que nous pouvons lire la documentation et repartir confus, n&rsquo;est-ce pas\u00a0?<\/p>\n<p>Pensez-y de cette fa\u00e7on:<\/p>\n<ol>\n<li>Un filtre est une fonction qui accepte les entr\u00e9es \u00e0 traiter.<\/li>\n<li>L&rsquo;entr\u00e9e est trait\u00e9e en fonction de la d\u00e9finition de la fonction.<\/li>\n<li>La fonction renvoie alors la valeur trait\u00e9e.<\/li>\n<\/ol>\n<p>Ce que vous faites avec la valeur renvoy\u00e9e d\u00e9pend de vous, mais lorsque vous appliquez un filtre ou appelez <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/apply_filters\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">apply_filters<\/a> \u00e0 une information, vous dites \u00e0 WordPress: \u00abJ&rsquo;ai cette information, veuillez appliquer le filtre identifi\u00e9 par cette cl\u00e9 et remettre le le r\u00e9sultat me revient.&quot;<\/p>\n<p>Pas mal, non ?<\/p>\n<h3>Comment \u00e7a marche?<\/h3>\n<p>Mais il y a une partie de ce qui pr\u00e9c\u00e8de qui m\u00e8ne \u00e0 une question. Concr\u00e8tement, je pr\u00e9cise que \u00ab\u2026veuillez appliquer le filtre identifi\u00e9 par cette cl\u00e9\u2026\u00bb et l&rsquo;id\u00e9e de cl\u00e9 peut pr\u00eater \u00e0 confusion d&rsquo;autant plus qu&rsquo;un filtre ou une action ou plus g\u00e9n\u00e9ralement un hook peut \u00eatre identifi\u00e9 par ce qu&rsquo;on appelle un tag ou un cl\u00e9.<\/p>\n<p>Ce sont des synonymes. Ainsi, lorsque vous voyez une <strong>balise<\/strong> ou <strong>une cl\u00e9<\/strong> dans le contexte d&rsquo;un crochet, traitez-les comme telles.<\/p>\n<p>Cela dit, voici comment cela fonctionne\u00a0:<\/p>\n<ol>\n<li>La fonction apply_filters accepte deux arguments. La premi\u00e8re est la balise ou la cl\u00e9 (selon comment vous voulez l&rsquo;appeler) associ\u00e9e au filtre (lire: fonction) que vous souhaitez utiliser pour traiter le travail, la seconde est la valeur que vous souhaitez traiter au sein de ladite fonction.<\/li>\n<li>Le filtre se d\u00e9clenchera et renverra un r\u00e9sultat (ou, rappelez-vous, la fonction que nous avons d\u00e9finie).<\/li>\n<li>Nous prenons ensuite la valeur renvoy\u00e9e et l&rsquo;appliquons \u00e0 la propri\u00e9t\u00e9 de notre choix.<\/li>\n<\/ol>\n<p>Ainsi, par exemple, vous \u00eates susceptible de voir quelque chose <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-01-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comme \u00e7a<\/a> dans la base de code de quelqu&rsquo;un d&rsquo;autre (ou peut-\u00eatre m\u00eame la v\u00f4tre)\u00a0:<\/p>\n<pre><code>&lt;?php\n\n$post-&gt;post_content = apply_filters( 'the_content', $my_content );\n<\/code><\/pre>\n<p>Et maintenant que vous avez un peu de contexte sur la fa\u00e7on dont cela fonctionne, vous avez l&rsquo;id\u00e9e, n&rsquo;est-ce pas\u00a0?<\/p>\n<h3>Comment l&rsquo;utilisons-nous ?<\/h3>\n<p>Cela ram\u00e8ne la boucle de la publication \u00e0 la question initiale de savoir comment nous pouvons utiliser apply_filters pour post_content chaque fois que nous devons ins\u00e9rer ou mettre \u00e0 jour une publication.<\/p>\n<p>Disons donc que vous avez le contenu que vous souhaitez appliquer (ou ajouter) \u00e0 la valeur du contenu d&rsquo;un article. Vous pourriez faire quelque chose <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-02-dont-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comme \u00e7a<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = $new_content;\n<\/code><\/pre>\n<p>Mais c&rsquo;est une mauvaise forme. Au lieu de cela, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/a14b284a07d515fe2b08c62ec48ff8fd#file-03-apply-filters-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vous faites ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assume $contents is an array of information we want to convert into content for a post.\n *\/\n\n$new_content = '';\nforeach ($contents as $line) {\n\n    if (false === strpos( $line, $name)) {\n        $new_content .= $line;\n    }\n}\n\n$post-&gt;post_content = apply_filters( 'the_content', $new_content );\n<\/code><\/pre>\n<p>Et c&rsquo;est comme \u00e7a que WordPress le fait.<\/p>\n<h2>Conclusion<\/h2>\n<p>Donc, compte tenu de toutes les informations et du code ci-dessus, vous devez \u00eatre bien arm\u00e9 non seulement pour vous assurer que vous filtrez correctement les donn\u00e9es qui seront ins\u00e9r\u00e9es dans la base de donn\u00e9es, vous avez les connaissances n\u00e9cessaires pour d\u00e9finir vos filtres et les appliquer \u00e0 toutes les donn\u00e9es que vous jugez appropri\u00e9es.<\/p>\n<p>Mais des exemples pour cela sont le contenu d&rsquo;un autre article.<\/p>\n<p>En attendant, si vous travaillez avec du contenu de publication, assurez-vous de filtrer correctement les donn\u00e9es avant de les d\u00e9poser dans la base de donn\u00e9es.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si vous ins\u00e9rez ou mettez \u00e0 jour des publications par programmation, il est important de vous assurer que vous filtrez correctement le contenu des publications.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,801,811,862],"tags":[1167],"class_list":["post-229315","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-php-3","category-plugins-2","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=229315"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229315\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}