El formulario del complemento de carga de WordPress no se activará en el navegador sin cabeza

3 minutos de lectura

avatar de usuario
Ethan

Estoy trabajando en un pequeño proyecto donde PhamtomJS iniciará sesión en mi sitio y cargará un complemento en él. Casi lo tengo, excepto por un problema extraño. Aunque el file.upload parte de mi código funciona perfectamente, el botón Instalar ahora permanece deshabilitado. Aquí hay una imagen renderizada de Phantom:

Captura de pantalla

Como puede ver, el botón aún está deshabilitado. Entonces, cuando trato de hacer clic en él usando el getElementById() método, no funcionará. Tampoco funcionará si trato de enviar el formulario haciendo:

document.querySelector('form[action*="/wp-admin/update.php?action=upload-plugin"]').submit()

También intenté habilitar el botón manualmente y luego hacer clic en él a través de Javascript, pero tampoco funcionó. ¿Algunas ideas?

EDITAR
Al intentar extraer el código HTML externo del botón, escribí lo siguiente en console:

console.log(document.querySelector('#install-plugin-submit').outerHTML)

El resultado de este código fue el siguiente:

<input type="submit" name="install-plugin-submit" id="install-plugin-submit" class="button" value="Install Now">

  • ¿Estás hablando del botón ‘Cargar complemento’ o ‘Instalar ahora’? ¿Alguno tiene un atributo ‘deshabilitado’?

    – Goferkhan

    14/03/2017 a las 18:53

  • @Gopherkhan El botón instalar ahora

    – Ethan

    14/03/2017 a las 20:40

  • ¿Puedes agarrar el botón y registrar su HTML exterior?

    – Goferkhan

    14/03/2017 a las 23:11

  • @Gopherkhan ¿Qué quieres decir con esto? ¿Como inspeccionar la página, seleccionar el botón y compartir una captura de pantalla o algo así?

    – Ethan

    14/03/2017 a las 23:59

  • no, en realidad, más como console.log(document.querySelector(‘#your_button_id’).outerHTML). Supongo que hay alguna forma de descargar el registro de su ejecución fantasma

    – Goferkhan

    15 de marzo de 2017 a las 0:13


¿Cómo obtuvo el valor en el cuadro de entrada del archivo? Dependiendo de la implementación del navegador (cliente), simplemente agregar texto como el valor de entrada del archivo probablemente no activar la caja change evento.

La primera (léase: la más simple) solución puede ser intentar $('form.wp-upload-form input[type="file"]').trigger('change'); después de golpear en el valor. (Si no está utilizando jQuery, consulte aquí sobre cómo desencadenar un evento nativo; parece que ya sabe cómo seleccionar nodos. PhantomJS puede muy bien tener una función de activación nativa porque es el tipo de cosas que haces en ese tipo de aplicación).

De lo contrario, es posible que desee simplemente cargar el archivo a través de JS. Estoy en 4.7.3 y mi formulario se ve así:

<form method="post" enctype="multipart/form-data" class="wp-upload-form" action="http://[server]/wp-admin/update.php?action=upload-plugin">
<input type="hidden" id="_wpnonce" name="_wpnonce" value="[nonce]"><input type="hidden" name="_wp_http_referer" value="/wp-admin/plugin-install.php"> <label class="screen-reader-text" for="pluginzip">Plugin zip file</label>
<input type="file" id="pluginzip" name="pluginzip">
<input type="submit" name="install-plugin-submit" id="install-plugin-submit" class="button" value="Install Now" disabled="">
</form>

armar un FormData, raspe la URL de envío de la etiqueta de acción en el formulario, asegúrese de incluir el nonce y probablemente pase el valor de envío por si acaso. Montaje de un multipart/form-data POST es molesto sin un complemento adecuado, pero si ha llegado hasta aquí, probablemente ya haya tenido que lidiar con cosas más molestas.

WordPress no debería ser capaz de notar la diferencia entre lo que envía desde su propio formulario o lo que falsifica y arroja en la misma URL. Si es así, verifique la configuración de la cadena del cliente, asegúrese de tener el nonce correcto y asegúrese de configurar el referente [sic.] correctamente.

¿Ha sido útil esta solución?