{"id":230128,"date":"2022-11-22T17:18:00","date_gmt":"2022-11-22T14:18:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230128"},"modified":"2022-11-22T20:09:14","modified_gmt":"2022-11-22T17:09:14","slug":"telecharger-des-fichiers-dans-wordpress-revisited-partie-2-cote-serveur","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/telecharger-des-fichiers-dans-wordpress-revisited-partie-2-cote-serveur\/","title":{"rendered":"T\u00e9l\u00e9charger des fichiers dans WordPress Revisited, Partie 2 &#8211; C\u00f4t\u00e9 serveur"},"content":{"rendered":"\n<p>Avant de sauter directement dans le code pour cela, je voulais mentionner deux choses :<\/p>\n<ol>\n<li>Oui, j&rsquo;ai couvert cela en d\u00e9tail il y <strong><a href=\"https:\/\/tommcfarlin.com\/uploading-files-to-a-custom-directory\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a quelque temps,<\/a><\/strong><\/li>\n<li>Et ceci est la deuxi\u00e8me partie d&rsquo;une s\u00e9rie en deux parties.<\/li>\n<\/ol>\n<p>Si vous n&rsquo;avez pas lu <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/telechargement-de-fichiers-dans-wordpress-revisite-partie-1-le-cote-client\/\" title=\"la premi\u00e8re partie\">la premi\u00e8re partie<\/a>, faites-la d&rsquo;abord. L&rsquo;id\u00e9e est que le code fonctionnera en conjonction avec ce que je vais couvrir dans ce post pour s&rsquo;assurer que le c\u00f4t\u00e9 client et le c\u00f4t\u00e9 serveur sont couverts.<\/p>\n<p>En fin de compte, la raison de le d\u00e9composer ainsi n&rsquo;est pas seulement de s&rsquo;assurer que les choses sont faites correctement, mais aussi de s&rsquo;assurer que l&rsquo;utilisateur a l&rsquo;exp\u00e9rience la plus positive possible.<\/p>\n<p>Cela dit, voici comment proc\u00e9der pour t\u00e9l\u00e9charger des fichiers dans WordPress c\u00f4t\u00e9 serveur.<\/p>\n<h2>T\u00e9l\u00e9chargement de fichiers dans WordPress c\u00f4t\u00e9 serveur<\/h2>\n<p>Notez que m\u00eame si certaines v\u00e9rifications de s\u00e9curit\u00e9 peuvent \u2013 \u200b\u200bet doivent \u2013 \u200b\u200b\u00eatre effectu\u00e9es, je n&rsquo;ai pas encore trouv\u00e9 de moyen totalement infaillible pour d\u00e9tecter que le fichier en cours de t\u00e9l\u00e9chargement est du bon type.<\/p>\n<p>Cela signifie qu&rsquo;il est toujours possible qu&rsquo;un type de fichier incorrect soit t\u00e9l\u00e9charg\u00e9. Que ce soit malveillant ou non d\u00e9pend \u00e9videmment de l&rsquo;utilisateur final. Je partage juste ceci pour \u00eatre clair sur le fait que le code que je vais montrer est aussi bon que possible, mais qu&rsquo;il y a toujours un niveau de discr\u00e9tion que vous devez utiliser.<\/p>\n<p>Peut-\u00eatre vaut-il m\u00eame la peine de rechercher une biblioth\u00e8que tierce pour valider les donn\u00e9es binaires une fois qu&rsquo;elles sont re\u00e7ues. Mais je m&rsquo;\u00e9gare.<\/p>\n<h3>1 V\u00e9rifier les autorisations de l&rsquo;utilisateur<\/h3>\n<p>N&rsquo;oubliez pas que chaque fois que nous avons cr\u00e9\u00e9 le front-end, WordPress g\u00e9n\u00e8re un nonce afin que nous puissions l&rsquo;utiliser pour nous assurer que l&rsquo;utilisateur a l&rsquo;autorisation de t\u00e9l\u00e9charger le fichier.<\/p>\n<p>En plus de v\u00e9rifier le nonce, il y a plusieurs autres choses que j&rsquo;aime v\u00e9rifier, toutes regroup\u00e9es dans une m\u00e9thode appel\u00e9e <strong>userCanSave<\/strong>.<\/p>\n<p>Tout d&rsquo;abord, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-00-nonce-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">rappelez-vous le front-end\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;form method=\"post\"\n      enctype=\"multipart\/form-data\"\n      action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"\"&gt;\n    &lt;!-- Snip For Brevity ---&gt;\n    &lt;?php\n    wp_nonce_field(\n        'acme-item-upload',\n        'acme-item-importer'\n    );\n    ?&gt;\n&lt;\/form&gt;<\/code><\/pre>\n<p>Alors regardez comment je l&rsquo;utilise dans le code. Tout d&rsquo;abord, je d\u00e9finis la <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-01-usercansave-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fonction<\/a><\/strong> <strong>userCanSave<a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-01-usercansave-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Determines if the current user has permission to upload a file based on their current role and the values\n * of the security nonce.\n *\n * @param  string $nonce     The WordPress-generated nonce.\n * @param  string $action    The developer-generated action name.\n * @return bool              True if the user has permission to save; otherwise, false.\n *\/\nprivate function userCanSave($nonce, $action)\n{\n    $isNonceSet   = isset($_POST[$nonce]);\n    $isValidNonce = false;\n\n    if ($isNonceSet) {\n        $isValidNonce = wp_verify_nonce($_POST[$nonce], $action);\n    }\n\n    return ($isNonceSet &amp;&amp; $isValidNonce);\n}\n<\/code><\/pre>\n<p>Et puis j&rsquo;appelle simplement cela au d\u00e9but du processus. Si \u00e7a \u00e9choue, je <a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-01-save-part1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">reviens<\/a>.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Assuming the user has permission, verifies the security nonce and uploads the PDF file to the `uploads`\n * directory and the Media Library.\n *\/\npublic function save()\n{\n  if (!$this-&gt;userCanSave('acme-item-importer', 'acme-item-upload')) {\n    return;\n  }\n\n  \/\/ More to come...\n\n}\n<\/code><\/pre>\n<p>Je recommande d&rsquo;afficher un message d&rsquo;erreur, mais je m&rsquo;\u00e9gare sur ce point car il existe plusieurs fa\u00e7ons de le faire dans le message.<\/p>\n<h3>2 T\u00e9l\u00e9chargez le fichier<\/h3>\n<p>En supposant que l&rsquo;utilisateur est autoris\u00e9 \u00e0 v\u00e9rifier le fichier, il est alors possible de t\u00e9l\u00e9charger le fichier en toute s\u00e9curit\u00e9. Le processus pour ce faire est simple mais n\u00e9cessite encore un peu de travail avec l&rsquo;API WordPress (\u00e0 savoir avec la fonction <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_upload_bits\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_upload_bits<\/a> ).<\/p>\n<p>Tout d&rsquo;abord, le fichier doit \u00eatre extrait du global <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.files.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_FILES<\/a> de PHP, puis t\u00e9l\u00e9charg\u00e9. Lorsque vous faites cela, cependant, il est important de vous assurer que vous t\u00e9l\u00e9chargez un fichier avec <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-02-save-part2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;extension de fichier correcte<\/a><\/strong> (au moins).<\/p>\n<pre><code>&lt;?php\n\n$file_type = explode('.', $filename);\n$file_type = strtolower($file_type[count($file_type) - 1]);\nif ('pdf' !== $file_type) {\n  \/\/ Give your feedback of choice here.\n}\n<\/code><\/pre>\n<p>Si le type de fichier n&rsquo;est pas un PDF, vous pouvez g\u00e9n\u00e9rer une erreur, simplement revenir (bien que je ne sois pas fan de cela) ou <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-03-save-part3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">donner des commentaires \u00e0 l&rsquo;utilisateur<\/a><\/strong> (ce que je suis fan de faire).<\/p>\n<pre><code>&lt;?php\n\nif ($uploadFile['error']) {\n  \/\/ Your preferred method of feedback here.\n}<\/code><\/pre>\n<p>La derni\u00e8re \u00e9tape, cependant, consiste \u00e0 transf\u00e9rer le fichier dans le t\u00e9l\u00e9chargeur de m\u00e9dias.<\/p>\n<h3>3 Le charger dans le Media Uploader<\/h3>\n<p>La derni\u00e8re \u00e9tape de tout cela consiste \u00e0 transf\u00e9rer le fichier dans le t\u00e9l\u00e9chargeur de m\u00e9dias. Pour ce faire, vous avez besoin de plusieurs choses du noyau WordPress :<\/p>\n<ol>\n<li>la librairie file.php,<\/li>\n<li>un tableau de pi\u00e8ces jointes n\u00e9cessaire pour indiquer \u00e0 WordPress ce qui est ajout\u00e9,<\/li>\n<li>une fonction API WordPress, <strong>wp_insert_attachment<\/strong><\/li>\n<li>rediriger vers la page d&rsquo;appel<\/li>\n<\/ol>\n<p>Cela semble beaucoup, non\u00a0? Ce n&rsquo;est pas si mal.<\/p>\n<p>Je regroupe g\u00e9n\u00e9ralement l&rsquo;inclusion de la biblioth\u00e8que de fichiers WordPress et le <strong>wp_insert_attachment<\/strong> dans un seul bloc.<\/p>\n<p>Vous remarquerez que j&rsquo;ai d\u00e9fini le type MIME sur <strong>pdf<\/strong> et que je m&rsquo;assure que le titre n&rsquo;inclut rien d&rsquo;autre que le nom du fichier. Apr\u00e8s cela, j&rsquo;utilise <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_insert_attachment\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_insert_attachment<\/a> pour charger le fichier dans la m\u00e9diath\u00e8que.<\/p>\n<\/p>\n<p>Le code complet pour cela est <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-05-save-part5-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le suivant\u00a0:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nrequire_once(ABSPATH. \"wp-admin\". '\/includes\/file.php');\n$attachment  = array(\n    'post_mime_type' =&gt; 'pdf',\n    'post_title'     =&gt; preg_replace('\/.[^.]+$\/', '', $filename),\n    'post_status'    =&gt; 'inherit'\n);\n$attachment_id = wp_insert_attachment($attachment, $uploadFile['file']);\n<\/code><\/pre>\n<p>Apr\u00e8s cela, je redirige vers la page qui a commenc\u00e9 tout cela (qui est g\u00e9n\u00e9ralement la page d&rsquo;administration que nous avons vue dans le post pr\u00e9c\u00e9dent. Pour cela, je r\u00e9cup\u00e8re le _wp_http_referer du tableau <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.request.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_REQUEST<\/a> <strong>de<\/strong> PHP .<a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.request.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a><\/p>\n<pre><code>&lt;?php\nwp_safe_redirect(\n    $_REQUEST['_wp_http_referer'],\n    301\n);\nexit;\n<\/code><\/pre>\n<p>Et cela <a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-06-save-part6-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">redirigera<\/a> l&rsquo;utilisateur vers la page d&rsquo;o\u00f9 il vient.<\/p>\n<h2>Et le fichier est t\u00e9l\u00e9charg\u00e9<\/h2>\n<p>\u00c0 ce stade, nous avons d\u00e9fini ce que nous voulons faire\u00a0:<\/p>\n<ol>\n<li>Offrir une exp\u00e9rience client d\u00e9cente,<\/li>\n<li>T\u00e9l\u00e9vers\u00e9 le fichier dans la m\u00e9diath\u00e8que (avec possibilit\u00e9 d&rsquo;offrir des commentaires)<\/li>\n<li>Et redirig\u00e9 vers la page qui a tout d\u00e9clench\u00e9.<\/li>\n<\/ol>\n<p>Certes, il y a beaucoup de place pour les commentaires \u00e0 ce sujet, et je vous exhorte \u00e0 l&rsquo;adapter au besoin pour votre code, mais la base de ce dont vous avez besoin doit \u00eatre fournie \u00e0 la fois <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/telechargement-de-fichiers-dans-wordpress-revisite-partie-1-le-cote-client\/\" title=\"dans le post pr\u00e9c\u00e9dent\">dans le post pr\u00e9c\u00e9dent<\/a> et dans ce post.<\/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>Un exemple de code c\u00f4t\u00e9 serveur n\u00e9cessaire pour t\u00e9l\u00e9charger un fichier via WordPress (et le Media Uploader).<\/p>\n","protected":false},"author":1,"featured_media":164785,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,841,862],"tags":[1167],"class_list":["post-230128","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230128","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=230128"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230128\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/164785"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230128"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230128"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}