{"id":230119,"date":"2022-11-22T20:02:00","date_gmt":"2022-11-22T17:02:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230119"},"modified":"2022-11-09T20:10:52","modified_gmt":"2022-11-09T17:10:52","slug":"telechargement-de-fichiers-dans-wordpress-revisite-partie-1-le-cote-client","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/telechargement-de-fichiers-dans-wordpress-revisite-partie-1-le-cote-client\/","title":{"rendered":"T\u00e9l\u00e9chargement de fichiers dans WordPress, revisit\u00e9 : Partie 1 &#8211; Le c\u00f4t\u00e9 client"},"content":{"rendered":"\n<p>Il y a des ann\u00e9es, j&rsquo;ai \u00e9crit sur la fa\u00e7on de <a href=\"https:\/\/tommcfarlin.com\/upload-files-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e9l\u00e9charger des fichiers dans WordPress \u00e0<\/a> partir de la zone administrative. Ce message est pratiquement une mise \u00e0 jour de ce message, mais il couvre de nouvelles consid\u00e9rations que je fais et d&rsquo;autres processus que je pense n\u00e9cessaires.<\/p>\n<p>Pour cet article, je vais travailler sur l&rsquo;exemple du t\u00e9l\u00e9chargement d&rsquo;un fichier PDF et comment le rendre \u00e9galement disponible dans la m\u00e9diath\u00e8que.<\/p>\n<p>Ce faisant, je pr\u00e9vois \u00e9galement de couvrir certaines consid\u00e9rations \u00e0 prendre en compte c\u00f4t\u00e9 client et c\u00f4t\u00e9 serveur, ainsi que les \u00e9l\u00e9ments \u00e0 rechercher chaque fois que quelqu&rsquo;un transf\u00e8re des informations via le r\u00e9seau.<\/p>\n<h2>T\u00e9l\u00e9chargement de fichiers dans WordPress (et dans la m\u00e9diath\u00e8que)<\/h2>\n<p>Avant d&rsquo;en venir \u00e0 l&rsquo;essentiel de cet article, je suppose que vous avez\u00a0:<\/p>\n<ol>\n<li>Une page de sous-menu ou une configuration de page d&rsquo;administration avec une entr\u00e9e de fichier,<\/li>\n<li>Que vous \u00eates correctement configur\u00e9 pour accepter les types MIME,<\/li>\n<li>Que vous \u00eates \u00e0 l&rsquo;aise avec un peu de JavaScript,<\/li>\n<li>Et vous \u00eates \u00e0 l&rsquo;aise avec des messages personnalis\u00e9s en dehors de l&rsquo;API WordPress standard.<\/li>\n<\/ol>\n<p>Si c&rsquo;est le cas, tout le code devrait \u00eatre relativement explicite (pas que je ne le d\u00e9composerai pas morceau par morceau), mais si l&rsquo;un des \u00e9l\u00e9ments ci-dessus semble d\u00e9routant, alors le message peut inclure du mat\u00e9riel qui n\u00e9cessite un peu plus de recherches dans le Codex ou concernant JavaScript que je fournirai ici.<\/p>\n<p>Quoi qu&rsquo;il en soit, je ferai ce que je peux pour \u00eatre aussi complet que possible.<\/p>\n<h3>1 L&rsquo;id\u00e9e principale<\/h3>\n<p>L&rsquo;id\u00e9e de la fonctionnalit\u00e9 est simple: vous voulez donner \u00e0 l&rsquo;utilisateur la possibilit\u00e9 de t\u00e9l\u00e9charger des fichiers PDF via la zone d&rsquo;administration de WordPress. Vous souhaitez \u00e9galement que le fichier soit disponible dans la m\u00e9diath\u00e8que.<\/p>\n<p>La possibilit\u00e9 de le faire n&rsquo;est pas difficile, mais il existe des moyens d&rsquo;am\u00e9liorer l&rsquo;exp\u00e9rience de l&rsquo;utilisateur que j&rsquo;aimerais \u00e9galement couvrir dans ce post (comme ne pas pouvoir t\u00e9l\u00e9charger quoi que ce soit tant que le fichier n&rsquo;a pas \u00e9t\u00e9 sp\u00e9cifi\u00e9 dans la zone de saisie, par exemple Exemple).<\/p>\n<h3>2 L&rsquo;interface utilisateur pour v\u00e9rifier le type de fichier<\/h3>\n<p>Tout d&rsquo;abord, comme je l&rsquo;ai dit en haut de l&rsquo;article, je suppose que vous avez jet\u00e9 les bases de la page d&rsquo;administration de WordPress. Cela peut \u00eatre fait de certaines mani\u00e8res &#8211; j&rsquo;ai choisi d&rsquo;utiliser <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">une page de sous-menu<\/a>, mais il existe plusieurs fa\u00e7ons de le faire.<\/p>\n<p>Deuxi\u00e8mement, la page est simple\u00a0: elle comprend le titre de la page, un champ de saisie de fichier et un bouton &quot;T\u00e9l\u00e9charger&quot; qui est d\u00e9sactiv\u00e9 par d\u00e9faut\u00a0:<\/p>\n<p>Notez que lorsque j&rsquo;essaie d&rsquo;ajouter une image qui n&rsquo;est pas un PDF, un message d&rsquo;erreur s&rsquo;affiche et le bouton &quot;T\u00e9l\u00e9charger&quot; est toujours d\u00e9sactiv\u00e9\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164805-61e76e82b59a7.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164805-61e76e82b59a7.png\" alt=\"T\u00e9l\u00e9chargement de fichiers dans WordPress, revisit\u00e9 : Partie 1 - Le c\u00f4t\u00e9 client\" ><\/a><\/p>\n<p>Mais lorsque j&rsquo;ajoute un fichier du type attendu, le bouton &quot;T\u00e9l\u00e9charger&quot; est activ\u00e9\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164805-61e76e857097f.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164805-61e76e857097f.png\" alt=\"T\u00e9l\u00e9chargement de fichiers dans WordPress, revisit\u00e9 : Partie 1 - Le c\u00f4t\u00e9 client\" ><\/a><\/p>\n<p>Cela n\u00e9cessite quelques \u00e9l\u00e9ments\u00a0:<\/p>\n<ul>\n<li>JavaScript qui renifle le type de fichier,<\/li>\n<li>Partials avec une visibilit\u00e9 qui peut \u00eatre bascul\u00e9e dynamiquement via JavaScript,<\/li>\n<li>Et la possibilit\u00e9 d&rsquo;activer ou de d\u00e9sactiver un bouton d&rsquo;entr\u00e9e de fichier.<\/li>\n<\/ul>\n<p><strong>Une remarque importante est<\/strong> que <strong>du c\u00f4t\u00e9 client\u00a0:<\/strong> nous ne pouvons que supposer que le fichier est le type de fichier appropri\u00e9 en fonction de son extension. Nous devrons faire plus de travail c\u00f4t\u00e9 serveur pour nous assurer que cela est exact.<\/p>\n<p>Mais le point de v\u00e9rifier c\u00f4t\u00e9 client pour s&rsquo;assurer que nous offrons la meilleure exp\u00e9rience possible gr\u00e2ce aux messages de notification et \u00e0 l&rsquo;activation ou \u00e0 la d\u00e9sactivation des options en fonction du type de fichier.<\/p>\n<h3>3 V\u00e9rification du type de fichier c\u00f4t\u00e9 client<\/h3>\n<p>Supposons pour cet exemple que nous ayons un partiel qui s&rsquo;affiche chaque fois que nous tentons de t\u00e9l\u00e9charger un fichier qui n&rsquo;est pas un PDF. Par d\u00e9faut, le conteneur a un <strong>style=&quot;display:none\u00a0;\u00a0\u00bb<\/strong> attribut que nous manipulerons via JavaScript sous peu\u00a0:<\/p>\n<pre><code>&lt;?php\n\/**\n * Displays whenever a person tries to upload a file that isn't a PDF. This is toggled via JavaScript.\n *\/\n?&gt;\n\n&lt;div id=\"invalid-file-message\" class=\"error notice is-dismissible\" style=\"display:none;\"&gt;\n    &lt;p&gt;You have attempted to upload an invalid file type.&lt;\/p&gt;\n    &lt;button type=\"button\" class=\"notice-dismiss\"&gt;\n        &lt;span class=\"screen-reader-text\"&gt;Dismiss this notice.&lt;\/span&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;&lt;!-- #invalid-file-message --&gt;\n<\/code><\/pre>\n<p>Notez que ce partiel a un ID <strong>invalid-file-message<\/strong>. C&rsquo;est un peu g\u00e9n\u00e9ralis\u00e9 car vous voudrez peut-\u00eatre le pr\u00e9fixer avec quelque chose d&rsquo;autre, mais pour les besoins de cet article, vous avez l&rsquo;id\u00e9e.<\/p>\n<p>Pour basculer la visibilit\u00e9 de ce message, vous devez configurer un gestionnaire en JavaScript pour surveiller le changement dans l&rsquo;\u00e9l\u00e9ment d&rsquo;entr\u00e9e du fichier.<\/p>\n<h3>4 Surveillance de l&rsquo;\u00e9l\u00e9ment d&rsquo;entr\u00e9e de fichier<\/h3>\n<p>\u00c0 ce stade, il doit y avoir un fichier JavaScript qui surveille la valeur de l&rsquo;\u00e9v\u00e9nement de <strong>modification<\/strong> de l&rsquo;\u00e9l\u00e9ment d&rsquo;entr\u00e9e de fichier afin qu&rsquo;il puisse d\u00e9terminer la marche \u00e0 suivre.<\/p>\n<p>Jetez un oeil \u00e0 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/79c7f788488e6dc84079fcf3795fa417#file-01-montorfileupload-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ce code:<\/a><\/p>\n<p>Ce code recherchera la valeur du champ de saisie. Si le type de fichier ne correspond pas \u00e0 <strong>pdf<\/strong>, la visibilit\u00e9 du message d&rsquo;erreur ci-dessus sera modifi\u00e9e\u00a0; sinon, il affichera le bouton de t\u00e9l\u00e9chargement.<\/p>\n<p>Et rappelez-vous, c&rsquo;est une bonne pratique de mettre ce script en file d&rsquo;attente uniquement dans la zone d&rsquo;administration et sur la <a href=\"https:\/\/gist.github.com\/tommcfarlin\/79c7f788488e6dc84079fcf3795fa417#file-02-enqueue-file-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">page o\u00f9 il est obligatoire<\/a> :<\/p>\n<pre><code>&lt;?php\n\npublic function enqueue()\n{\n    if (!is_admin() 'acme-upload-pdf' !== get_current_screen()-&gt;id) {\n        return;\n    }\n\n    wp_enqueue_script(\n        'acme-upload-pdf-admin',\n        $this-&gt;pluginUrl. 'assets\/scripts\/admin.js',\n        ['jquery'],\n    );\n}\n<\/code><\/pre>\n<p>Tout cela garantira que votre plugin enregistre correctement le script sur la page sur laquelle il est n\u00e9cessaire, nulle part ailleurs, et qu&rsquo;il v\u00e9rifie correctement pour s&rsquo;assurer que le fichier sp\u00e9cifi\u00e9 est du bon type.<\/p>\n<h2>Mais il y a plus<\/h2>\n<p>\u00c0 l&rsquo;origine, il s&rsquo;agissait d&rsquo;un seul article, mais la quantit\u00e9 de contenu n\u00e9cessaire pour tout exiger prendrait trop de temps \u00e0 passer au crible (du moins, \u00e0 mon avis). J&rsquo;essaie donc de le rendre un peu plus facile \u00e0 suivre en le divisant en quelques messages.<\/p>\n<p>Comme mentionn\u00e9 pr\u00e9c\u00e9demment, nous ne pouvons pas faire grand-chose c\u00f4t\u00e9 client. Bien s\u00fbr, weUplo peut prendre des mesures pour am\u00e9liorer l&rsquo;exp\u00e9rience utilisateur, mais ce n&rsquo;est pas la plus s\u00e9curis\u00e9e et il reste encore du travail \u00e0 faire c\u00f4t\u00e9 serveur.<\/p>\n<p>Dans la seconde moiti\u00e9 de cette s\u00e9rie, j&rsquo;examinerai le PHP requis pour g\u00e9rer le t\u00e9l\u00e9chargement de fichiers et le faire en toute s\u00e9curit\u00e9.<\/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>Lorsque vous envisagez de t\u00e9l\u00e9charger des fichiers dans WordPress, il est important de penser \u00e9galement \u00e0 l&rsquo;exp\u00e9rience de l&rsquo;utilisateur et aux aspects de s\u00e9curit\u00e9.<\/p>\n","protected":false},"author":1,"featured_media":164806,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,841,862],"tags":[1167],"class_list":["post-230119","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230119","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=230119"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230119\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/164806"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}