{"id":229708,"date":"2022-11-22T16:51:00","date_gmt":"2022-11-22T13:51:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229708"},"modified":"2022-11-22T20:09:04","modified_gmt":"2022-11-22T17:09:04","slug":"failide-ueleslaadimine-wordpressis-revisited-2-osa-serveripool","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/failide-ueleslaadimine-wordpressis-revisited-2-osa-serveripool\/","title":{"rendered":"Failide \u00fcleslaadimine WordPressis Revisited, 2. osa \u2013 serveripool"},"content":{"rendered":"\n<p>Enne selle koodi juurde h\u00fcppamist tahtsin mainida kahte asja:<\/p>\n<ol>\n<li>Jah, ma olen seda m\u00f5nda <strong><a href=\"https:\/\/tommcfarlin.com\/uploading-files-to-a-custom-directory\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aega tagasi \u00fcksikasjalikult k\u00e4sitlenud,<\/a><\/strong><\/li>\n<li>Ja see on kaheosalise sarja teine \u200b\u200bosa.<\/li>\n<\/ol>\n<p>Kui te pole <a href=\"https:\/\/wordpress.mediadoma.com\/et\/failide-ueleslaadimine-wordpressis-uuesti-laebi-vaadatud-1-osa-kliendi-pool\/\" title=\"esimest osa\">esimest osa<\/a> lugenud, tehke seda k\u00f5igepealt. Idee seisneb selles, et kood t\u00f6\u00f6tab koos sellega, mida ma selles postituses k\u00e4sitlen, et tagada nii kliendi- kui ka serveripoolne h\u00f5lmatus.<\/p>\n<p>L\u00f5ppkokkuv\u00f5ttes ei ole selle sellise lagunemise p\u00f5hjus mitte ainult veenduda, et asjad on \u00f5igesti tehtud, vaid ka see, et kasutajal oleks v\u00f5imalikult positiivne kogemus.<\/p>\n<p>Seda arvestades toimige j\u00e4rgmiselt, kuidas WordPressi serveri poolel faile \u00fcles laadida.<\/p>\n<h2>Failide \u00fcleslaadimine WordPressis serveri poolel<\/h2>\n<p>Pange t\u00e4hele, et kuigi on olemas turvakontrolle, mida saab \u2013 ja peakski \u2013 tegema, ei ole ma veel leidnud viisi, mis oleks t\u00e4iesti lollikindel tuvastamaks, et \u00fcleslaaditav fail on \u00f5iget t\u00fc\u00fcpi.<\/p>\n<p>See t\u00e4hendab, et on endiselt v\u00f5imalus, et \u00fcles laaditakse vale failit\u00fc\u00fcp. See, kas see on pahatahtlik v\u00f5i mitte, on ilmselt l\u00f5ppkasutaja otsustada. Jagan seda, et olla selge, et kood, mida ma n\u00e4itan, on nii hea kui suudan, kuid teil on siiski teatud kaalutlus\u00f5igus.<\/p>\n<p>V\u00f5ib-olla tasub isegi otsida kolmanda osapoole teeki, et binaarandmed p\u00e4rast nende k\u00e4ttesaamist kinnitada. Aga ma kaldun k\u00f5rvale.<\/p>\n<h3>1 Kontrollige kasutaja \u00f5igusi<\/h3>\n<p>Pidage meeles, et iga kord, kui oleme esiotsa loonud, laseme WordPressil genereerida nonce&#8217;i, et saaksime seda kasutada veendumaks, et kasutajal on luba faili \u00fcleslaadimiseks.<\/p>\n<p>Lisaks nonce&#8217;i kontrollimisele meeldib mulle kontrollida mitmeid muid asju, mis k\u00f5ik on koondatud meetodisse nimega <strong>userCanSave<\/strong>.<\/p>\n<p>Esiteks <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-00-nonce-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tuletage meelde esiosa:<\/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>Seej\u00e4rel vaadake, kuidas ma seda koodis kasutan. Esiteks m\u00e4\u00e4ratlen <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-01-usercansave-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funktsiooni<\/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>Ja siis ma lihtsalt nimetan seda protsessi alguses. Kui see eba\u00f5nnestub, p\u00f6\u00f6rdun <a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-01-save-part1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tagasi<\/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>Soovitan kuvada veateade, kuid kaldun sellel teemal k\u00f5rvale, kuna postituses on m\u00f5ned v\u00f5imalused seda teha.<\/p>\n<h3>2 Laadige fail \u00fcles<\/h3>\n<p>Eeldades, et kasutajal on luba faili kontrollida, on faili \u00fcleslaadimine ohutu. Protsess selle tegemiseks on lihtne, kuid n\u00f5uab siiski natuke t\u00f6\u00f6d WordPressi API-ga (nimelt funktsiooniga <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>Esiteks tuleb fail PHP <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.files.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_FILES<\/a> globaalsest failist haarata ja seej\u00e4rel \u00fcles laadida. Seda tehes on aga oluline veenduda, et laadite \u00fcles <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-02-save-part2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00f5ige faililaiendiga faili<\/a><\/strong> (v\u00e4hemalt).<\/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>Kui failit\u00fc\u00fcp ei ole PDF, saate teha vea, lihtsalt tagastada (kuigi ma ei ole selle f\u00e4nn) v\u00f5i <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-03-save-part3-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">anda kasutajale tagasisidet<\/a><\/strong> (mida ma armastan).<\/p>\n<pre><code>&lt;?php\n\nif ($uploadFile['error']) {\n  \/\/ Your preferred method of feedback here.\n}<\/code><\/pre>\n<p>Viimane samm on aga faili viimine meediumi \u00fcleslaadijasse.<\/p>\n<h3>3 Laadige see meedia \u00fcleslaadijasse<\/h3>\n<p>Selle k\u00f5ige viimane samm on faili viimine meediumi \u00fcleslaadijasse. Selleks vajate WordPressi tuumast mitut asja:<\/p>\n<ol>\n<li>fail.php teek,<\/li>\n<li>manuste massiiv, mis on vajalik lisatavast WordPressile teatamiseks,<\/li>\n<li>WordPressi API funktsioon, <strong>wp_insert_attachment<\/strong><\/li>\n<li>suunab tagasi helistavale lehele<\/li>\n<\/ol>\n<p>K\u00f5lab nagu palju, eks? See pole v\u00e4ga hull.<\/p>\n<p>Tavaliselt r\u00fchmitan WordPressi failiteegi ja faili <strong>wp_insert_attachment<\/strong> kaasamise \u00fchte plokki.<\/p>\n<p>M\u00e4rkate, et m\u00e4\u00e4ran MIME t\u00fc\u00fcbiks <strong>pdf<\/strong> ja veendun, et pealkiri ei sisaldaks midagi peale faili nime. P\u00e4rast seda kasutan faili meediumiteeki laadimiseks <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_insert_attachment\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_insert_attachment .<\/a><\/p>\n<\/p>\n<p>Selle t\u00e4ielik kood on <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-05-save-part5-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rgmine:<\/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>P\u00e4rast seda suunan ma tagasi lehele, kust see k\u00f5ik alguse sai (mis on tavaliselt see administraatori leht, mida n\u00e4gime eelmises postituses. Selleks <strong>haaran<\/strong> PHP massiivist <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.request.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_REQUEST _wp_http_refereri<\/a>.<\/p>\n<pre><code>&lt;?php\nwp_safe_redirect(\n    $_REQUEST['_wp_http_referer'],\n    301\n);\nexit;\n<\/code><\/pre>\n<p>Ja see <a href=\"https:\/\/gist.github.com\/tommcfarlin\/51b158a2cbc4052bef12cc059837a6ee#file-06-save-part6-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">suunab<\/a> kasutaja tagasi lehele, kust ta tuli.<\/p>\n<h2>Ja fail on \u00fcles laaditud<\/h2>\n<p>Siinkohal oleme paika pannud, mida tahame teha:<\/p>\n<ol>\n<li>Pakkuge korralikku kliendipoolset kogemust,<\/li>\n<li>Laadis faili \u00fcles meediumiteeki (koos v\u00f5imalusega anda tagasisidet)<\/li>\n<li>Ja suunati tagasi lehele, kust see k\u00f5ik alguse sai.<\/li>\n<\/ol>\n<p>T\u00f5si, selles on palju ruumi tagasisidele ja soovitan teil seda koodi jaoks vastavalt vajadusele kohandada, kuid selle, mida vajate, tuleks esitada nii <a href=\"https:\/\/wordpress.mediadoma.com\/et\/failide-ueleslaadimine-wordpressis-uuesti-laebi-vaadatud-1-osa-kliendi-pool\/\" title=\"eelmises postituses\">eelmises postituses<\/a> kui ka selles postituses.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>N\u00e4ide serveripoolsest koodist, mis on vajalik faili \u00fcleslaadimiseks WordPressi (ja Media Uploaderi) kaudu.<\/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":[894,842,863],"tags":[1165,1165],"class_list":["post-229708","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kood","category-opetused","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229708","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=229708"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229708\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/164785"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=229708"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=229708"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=229708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}