{"id":229870,"date":"2022-11-22T20:34:00","date_gmt":"2022-11-22T17:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229870"},"modified":"2022-11-09T16:45:16","modified_gmt":"2022-11-09T13:45:16","slug":"subir-archivos-en-wordpress-revisado-parte-1-el-lado-del-cliente","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/subir-archivos-en-wordpress-revisado-parte-1-el-lado-del-cliente\/","title":{"rendered":"Subir archivos en WordPress, revisado: Parte 1 &#8211; El lado del cliente"},"content":{"rendered":"\n<p>Hace a\u00f1os escrib\u00ed sobre c\u00f3mo <a href=\"https:\/\/tommcfarlin.com\/upload-files-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">subir archivos en WordPress<\/a> desde el \u00e1rea administrativa. Esta publicaci\u00f3n es pr\u00e1cticamente una actualizaci\u00f3n de esa publicaci\u00f3n, pero cubre nuevas consideraciones que hago y algunos otros procesos que creo que son necesarios.<\/p>\n<p>Para esta publicaci\u00f3n, voy a trabajar con el ejemplo de cargar un archivo PDF y c\u00f3mo tambi\u00e9n hacer que est\u00e9 disponible en la Biblioteca de medios.<\/p>\n<p>Al hacerlo, tambi\u00e9n estoy planeando cubrir algunas consideraciones que se deben hacer en el lado del cliente y en el lado del servidor, as\u00ed como cosas que buscar cada vez que alguien transfiera informaci\u00f3n a trav\u00e9s del cable.<\/p>\n<h2>Carga de archivos en WordPress (y en la biblioteca multimedia)<\/h2>\n<p>Antes de llegar a la esencia de esta publicaci\u00f3n, supongo que tienes:<\/p>\n<ol>\n<li>Una p\u00e1gina de submen\u00fa o configuraci\u00f3n de p\u00e1gina de administraci\u00f3n con una entrada de archivo,<\/li>\n<li>Que est\u00e1 configurado correctamente para aceptar tipos MIME,<\/li>\n<li>Que te sientas c\u00f3modo con un poco de JavaScript,<\/li>\n<li>Y te sientes c\u00f3modo trabajando con mensajes personalizados fuera de la API est\u00e1ndar de WordPress.<\/li>\n<\/ol>\n<p>Si es as\u00ed, todo el c\u00f3digo debe explicarse por s\u00ed mismo (no es que no lo desglose pieza por pieza), pero si algo de lo anterior suena confuso, entonces la publicaci\u00f3n puede incluir alg\u00fan material que requiera un poco m\u00e1s investigaci\u00f3n en el Codex o sobre JavaScript que proporcionar\u00e9 aqu\u00ed.<\/p>\n<p>De todos modos, har\u00e9 lo que pueda para ser lo m\u00e1s completo posible.<\/p>\n<h3>1 La idea principal<\/h3>\n<p>La idea de la funci\u00f3n es simple: desea brindarle al usuario la capacidad de cargar archivos PDF a trav\u00e9s del \u00e1rea de administraci\u00f3n de WordPress. Tambi\u00e9n desea que el archivo est\u00e9 disponible en la Biblioteca multimedia.<\/p>\n<p>La capacidad de hacer esto no es dif\u00edcil, pero hay formas de mejorar la experiencia del usuario que tambi\u00e9n me gustar\u00eda cubrir en esta publicaci\u00f3n (como no poder cargar nada hasta que el archivo se haya especificado en el cuadro de entrada, para ejemplo).<\/p>\n<h3>2 La interfaz de usuario para verificar el tipo de archivo<\/h3>\n<p>Primero, como dije en la parte superior de la publicaci\u00f3n, asumo que tiene las bases establecidas para la p\u00e1gina de administraci\u00f3n en WordPress. Esto se puede hacer de varias maneras: he optado por usar <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una p\u00e1gina de submen\u00fa<\/a>, pero hay algunas formas de hacerlo.<\/p>\n<p>En segundo lugar, la p\u00e1gina es simple: incluye el t\u00edtulo de la p\u00e1gina, un campo de entrada de archivo y un bot\u00f3n &quot;Cargar&quot; que est\u00e1 deshabilitado de forma predeterminada:<\/p>\n<p>Tenga en cuenta que cuando intento agregar una imagen que no es un PDF, aparece un mensaje de error y el bot\u00f3n &#8216;Cargar&#8217; a\u00fan est\u00e1 deshabilitado:<\/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=\"Subir archivos en WordPress, revisado: Parte 1 - El lado del cliente\" ><\/a><\/p>\n<p>Pero cuando agrego un archivo que es del tipo esperado, el bot\u00f3n &#8216;Cargar&#8217; est\u00e1 habilitado:<\/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=\"Subir archivos en WordPress, revisado: Parte 1 - El lado del cliente\" ><\/a><\/p>\n<p>Esto requiere algunas cosas:<\/p>\n<ul>\n<li>JavaScript que detecta el tipo de archivo,<\/li>\n<li>Parciales con visibilidad que se puede alternar din\u00e1micamente a trav\u00e9s de JavaScript,<\/li>\n<li>Y la capacidad de habilitar o deshabilitar un bot\u00f3n de entrada de archivos.<\/li>\n<\/ul>\n<p><strong>Una nota importante es<\/strong> que <strong>en el lado del cliente:<\/strong> solo podemos asumir que el archivo es del tipo de archivo adecuado en funci\u00f3n de su extensi\u00f3n. Tendremos que trabajar m\u00e1s en el lado del servidor para garantizar que esto sea correcto.<\/p>\n<p>Pero el punto de verificar en el lado del cliente para asegurarnos de brindar la mejor experiencia posible a trav\u00e9s de mensajes de notificaci\u00f3n y habilitar o deshabilitar opciones seg\u00fan el tipo de archivo.<\/p>\n<h3>3 Verificaci\u00f3n del tipo de archivo en el lado del cliente<\/h3>\n<p>Supongamos que para este ejemplo tenemos un parcial que se procesa cada vez que intentamos cargar un archivo que no es un PDF. De forma predeterminada, el contenedor tiene un <strong>estilo=&quot;display:none;&quot;<\/strong> atributo que manipularemos a trav\u00e9s de JavaScript en breve:<\/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>Tenga en cuenta que este parcial tiene un ID de <strong>mensaje de archivo no v\u00e1lido<\/strong>. Esto es un poco generalizado, ya que es posible que desee prefijarlo con otra cosa, pero para los fines de esta publicaci\u00f3n, entiende la idea.<\/p>\n<p>Para alternar la visibilidad de este mensaje, debe configurar un controlador en JavaScript para monitorear el cambio en el elemento de entrada del archivo.<\/p>\n<h3>4 Supervisi\u00f3n del elemento de entrada de archivos<\/h3>\n<p>En este punto, debe haber un archivo JavaScript que supervise el valor del evento de <strong>cambio<\/strong> del elemento de entrada del archivo para que pueda determinar qu\u00e9 curso de acci\u00f3n tomar.<\/p>\n<p>Echa un vistazo a <a href=\"https:\/\/gist.github.com\/tommcfarlin\/79c7f788488e6dc84079fcf3795fa417#file-01-montorfileupload-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">este c\u00f3digo:<\/a><\/p>\n<p>Este c\u00f3digo buscar\u00e1 el valor del campo de entrada. Si el tipo de archivo no coincide con <strong>pdf<\/strong>, alternar\u00e1 la visibilidad del mensaje de error anterior; de lo contrario, mostrar\u00e1 el bot\u00f3n de carga.<\/p>\n<p>Y recuerde, es una buena pr\u00e1ctica poner en cola este script solo en el \u00e1rea de administraci\u00f3n y en la <a href=\"https:\/\/gist.github.com\/tommcfarlin\/79c7f788488e6dc84079fcf3795fa417#file-02-enqueue-file-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina que se requiere<\/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>Todo esto asegurar\u00e1 que su complemento registre correctamente el script en la p\u00e1gina en la que se necesita, en ning\u00fan otro lugar, y que verifique correctamente para asegurarse de que el archivo especificado sea del tipo correcto.<\/p>\n<h2>Pero hay m\u00e1s<\/h2>\n<p>Originalmente, esta iba a ser una sola publicaci\u00f3n, pero la cantidad de contenido para requerirlo todo tomar\u00eda demasiado tiempo para analizar (al menos, en mi opini\u00f3n). As\u00ed que estoy tratando de hacerlo un poco m\u00e1s f\u00e1cil de seguir dividi\u00e9ndolo en un par de publicaciones.<\/p>\n<p>Como se mencion\u00f3 anteriormente, no hay mucho que podamos hacer en el lado del cliente. Claro, hay pasos que weUplo puede tomar para ayudar a mejorar la experiencia del usuario, pero no es el m\u00e1s seguro y hay m\u00e1s trabajo por hacer en el lado del servidor.<\/p>\n<p>En la segunda mitad de esta serie, analizar\u00e9 el PHP necesario para administrar la carga de archivos y hacerlo de manera segura.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Al mirar la carga de archivos en WordPress, tambi\u00e9n es importante pensar en la experiencia del usuario y los aspectos de seguridad.<\/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":[892,716,840,861],"tags":[1172],"class_list":["post-229870","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229870"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229870\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/164806"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}