plugin-development – Usando wp_filesystem en complementos

Pregunta:

Escribí un complemento ( https://github.com/bassjobsen/custom-bootstrap-editor ) este complemento escribe una hoja de estilo en wp-content/uploads/cbe .

Usaré algo como el siguiente código para hacer esto:

$upload_dir = wp_upload_dir();
$this->folder = trailingslashit($upload_dir['basedir']).'cbe/';
if( !is_dir( $this->folder ) ) wp_mkdir_p( $this->folder );
if ( is_writable( $this->folder ) ){
    file_put_contents( $this->folder.$this->filename, $css);
}

Mi primera pregunta sobre lo anterior, ¿cuál será el mejor lugar para verificar si wp_upload_dir () se puede escribir? ¿Habrá una verificación estándar (más error) para esto?

Después de leer http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ también recibí algunas otras preguntas.

La publicación mencionada me dice que debo usar la API del sistema de archivos para reemplazar el código anterior. ¿Esta observación seguirá siendo cierta?

request_filesystem_credentials parece funcionar como se esperaba, pero iniciar sesión para cada cambio de archivo parece una especie de exageración. ¿Mi complemento podría omitir la pantalla de inicio de sesión?

Aunque los créditos parecen válidos, mi $wp_filesystem->mkdir( $folder ) y $wp_filesystem->put_contents( $folder.'/'.$filename, $css, FS_CHMOD_FILE) siempre parece devolver falso. ¿Cómo puedo depurar las llamadas a la API del sistema de archivos?

actualización gracias a la escritura de archivos @otto funciona ahora:

if (isset($_POST['SaveCBESettings'])) {

        if ( !empty($_POST) && check_admin_referer( 'cbe-nonce') ) 
        {



            $SaveCBESettings = 1;
            $in = true;
            $url = wp_nonce_url('options-general.php?page=filewriting','cbe-nonce');
            if (false === ($creds = request_filesystem_credentials($url, '', false, false, array('SaveCBESettings')) ) ) {
                $in = false;
            }
            if ($in && ! WP_Filesystem($creds) ) {
                // our credentials were no good, ask the user for them again
                request_filesystem_credentials($url, '', true, false,array('SaveCBESettings'));
                $in = false;
            }
            if($in)
            {
            // by this point, the $wp_filesystem global should be working, so let's use it to create a file
            global $wp_filesystem;
            $contentdir = trailingslashit( $wp_filesystem->wp_content_dir() ); 
            $wp_filesystem->mkdir( $contentdir. 'cbe' );
            if ( ! $wp_filesystem->put_contents(  $contentdir . 'cbe/test.txt', 'Test file contents', FS_CHMOD_FILE) ) 
            {
                echo "error saving file!";
            }
                unset($_POST);
            }
        }
}

Respuesta:

Pocas cosas para explicar aquí:

En ese tutorial, solo elegí upload_dir como un ejemplo de cómo hacerlo. Una demostración de cómo funcionan las funciones de WP_Filesystem. Normalmente, no usaría WP_Filesystem para escribir en el directorio de carga. Ese código no está destinado a copiarse en código de producción en vivo.

Escribir CSS, PHP, HTML o cualquier otro tipo de archivos, excepto imágenes, en el directorio de carga … y que luego se incluirán en la página web de alguna manera, no es seguro.

Realmente no importa cómo lo haga, se espera que el directorio de carga contenga cosas que no se consideran necesariamente seguras para XSS por su propia naturaleza. Si necesita escribir archivos para incluirlos en la página, como hojas de estilo, debe crear su propia carpeta en / wp-content, no en / wp-content / uploads. El directorio de cargas debe usarse estrictamente para archivos multimedia y descargas y otras cosas cargadas a través de las diversas funciones de wp_upload.

Cuando se usa $ wp_filesystem, hay una práctica llamada a función para obtener la ruta del directorio de contenido: $wp_filesystem->wp_content_dir(); . Debe utilizar esta función porque la ruta del directorio "remoto" puede no ser la misma que la ruta del directorio "local".

No existe una función similar para obtener uploads_dir, porque de nuevo, normalmente nunca haría eso. Realmente no tiene mucho sentido usar el directorio de cargas para esos archivos.

Entonces, esto le dará la ruta "remota" al directorio de contenido, y puede usarla para escribir archivos y crear directorios y cosas así:

$contentdir = trailingslashit( $wp_filesystem->wp_content_dir() ); 
$wp_filesystem->mkdir( $contentdir. 'cbe' );
$wp_filesystem->put_contents( $contentdir . 'cbe/filename.whatever', $css, FS_CHMOD_FILE);

Etcétera. Por supuesto, todavía necesita solicitar las credenciales y crear una instancia con la WP_Filesystem($creds) primero para usar ese global $wp_filesystem , pero esto funciona.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım