¿Es posible reorganizar el directorio de cargas de WordPress?

8

Tengo un sitio de WordPress donde se han subido todas las cargas /wp-content/uploads/*. Ahora que hay miles de imágenes, hay un éxito en el rendimiento, y me han asignado para ayudar a remediarlo.

¿Alguien ha reordenado el directorio de cargas antes? ¿Moverlo a un AAA / MM más estructurado? Me encantaría escuchar algunas estrategias sobre cómo se logró esto.

thejimbirch
fuente

Respuestas:

10

Desafortunadamente, es un hecho muy triste sobre WordPress, casi no proporciona personalización para las cargas en el back-end (excepto las cosas de organización y / m).

Lo que puede hacer es crear su propia clase personalizada para generar las miniaturas (que son la parte más importante del impacto en el rendimiento, ya que cada imagen genera unas pocas docenas de miniaturas) de una manera más organizada.

Paso 1,2 y 3: haga una copia de seguridad de todas sus cargas. ¡Lo que vas a hacer no se puede revertir a menos que tengas una copia de seguridad de tu carpeta de cargas!

Paso 4: descargue e instale el complemento Limpiador de miniaturas . Esto le permite eliminar cada miniatura generada.

Paso 5: Crea tu propio método de generación. Tengo un ejemplo para ti:

add_filter('wp_image_editors', 'my_wp_image_editors');
function my_wp_image_editors($editors) {
    array_unshift($editors, "my_WP_Image_Editor");
    return $editors;
}
// Include the existing classes first in order to extend them.
require_once ABSPATH . WPINC . "/class-wp-image-editor.php";
require_once ABSPATH . WPINC . "/class-wp-image-editor-gd.php";
// Now we extend the original image editor class
class my_WP_Image_Editor extends WP_Image_Editor_GD {
    public function generate_filename($suffix = null, $dest_path = null, $extension = null) {
        // $suffix will be appended to the destination filename, just before the extension
        if (!$suffix) {
            $suffix = $this->get_suffix();
        }
        $dir = pathinfo($this->file, PATHINFO_DIRNAME);
        $ext = pathinfo($this->file, PATHINFO_EXTENSION);
        $name = wp_basename($this->file, ".$ext");
        $new_ext = strtolower($extension ? $extension : $ext );
        if (!is_null($dest_path) && $_dest_path = realpath($dest_path)) {
            $dir = $_dest_path;
        }
        //we get the dimensions using explode, we could have used the properties of $this->file[height] but the suffix could have been provided
        $size_from_suffix = explode("x", $suffix);
        //we get the slug_name for this dimension
        $slug_name = $this->get_slug_by_size($size_from_suffix[0], $size_from_suffix[1]);
        return trailingslashit( $dir ) . "{$slug_name}/{$name}.{$new_ext}";
    }
    function multi_resize($sizes) {
        $metadata = array();
        $orig_size = $this->size;
        foreach ( $sizes as $size => $size_data ) {
            if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
                continue;
            }
            if ( ! isset( $size_data['width'] ) ) {
                $size_data['width'] = null;
            }
            if ( ! isset( $size_data['height'] ) ) {
                $size_data['height'] = null;
            }
            if ( ! isset( $size_data['crop'] ) ) {
                $size_data['crop'] = false;
            }
            $image = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
            if ( ! is_wp_error( $image ) ) {
                $resized = $this->_save( $image );
                imagedestroy( $image );
                if ( ! is_wp_error( $resized ) && $resized ) {
                    unset( $resized['path'] );
                    $metadata[$size] = $resized;
                }
            }
            $this->size = $orig_size;
        }
        //we add the slug to the file path
        foreach ($metadata as $slug => $data) {
            $metadata[$slug]['file'] = $slug . "/" . $data['file'];
        }
        return $metadata;
    }
    // Our custom function to retrieve the proper slug by weight and height
    function get_slug_by_size($width, $height) {
        // Make thumbnails and other intermediate sizes.
        $_wp_additional_image_sizes = wp_get_additional_image_sizes();
        $image_sizes = array(); //all sizes the default ones and the custom ones in one array
        foreach (get_intermediate_image_sizes() as $s) {
            $image_sizes[$s] = array('width' => '', 'height' => '', 'crop' => false);
            if (isset($_wp_additional_image_sizes[$s]['width'])) {
                // For theme-added sizes
                $image_sizes[$s]['width'] = intval($_wp_additional_image_sizes[$s]['width']);
            } else {
                // For default sizes set in options
                $image_sizes[$s]['width'] = get_option("{$s}_size_w");
            }
            if (isset($_wp_additional_image_sizes[$s]['height'])) {
                // For theme-added sizes
                $image_sizes[$s]['height'] = intval($_wp_additional_image_sizes[$s]['height']);
            } else {
                // For default sizes set in options
                $image_sizes[$s]['height'] = get_option("{$s}_size_h");
            }
            if (isset($_wp_additional_image_sizes[$s]['crop'])) {
                // For theme-added sizes
                $image_sizes[$s]['crop'] = $_wp_additional_image_sizes[$s]['crop'];
            } else {
                // For default sizes set in options
                $image_sizes[$s]['crop'] = get_option("{$s}_crop");
            }
        }
        $slug_name = ""; //the slug's name
        if($width >= $height){
            foreach ($image_sizes as $slug => $data) { // we start checking
                if ($data['width'] == $width) {//we use only width because regardless of the height, the width is the one used for resizing in all cases with crop 1 or 0
                    $slug_name = $slug;
                }
                /*
                 * There could be custom added image sizes that have the same width as one of the defaults so we also use height here
                 * if there are several image sizes with the same width all of them will override the previous one leaving the last one, here we get also the last one
                 * since is looping the entire list, the height is used as a max value for non-hard cropped sizes
                 *  */
                  if ($data['width'] == $width && $data['height'] == $height) {
                      $slug_name = $slug;
                  }
        }
        } else {
            foreach ($image_sizes as $slug => $data) {
                if ($data['height'] == $height) {
                    $slug_name = $slug;
                }
                if ($data['height'] == $height && $data['width'] == $width ) {
                    $slug_name = $slug;
                }
            }
        }
        return $slug_name;
    }
}

Esta clase está casi copiada de la clase original incluida class-wp-image-editor-gd.php, con una diferencia: almacenará las miniaturas en carpetas separadas, todo dentro del directorio de cargas según su tamaño. Entonces, después de cargar una imagen, terminarás con algo como esto:

/uploads/image.jpg
/uploads/thumbnail/image.jpg
/uploads/medium/image.jpg
/uploads/large/image.jpg
// And so on...

Esto evitará tener un millón de imágenes dentro de una sola carpeta. Puede editar la clase de la manera que desee, cambiar las rutas y más. Se proporcionó como un ejemplo para demostrar cómo se generan y almacenan las imágenes.

Paso 6: Use el complemento Regenerar miniaturas para llenar su carpeta de subidas con miniaturas recién generadas, de una manera elegante. Esto evitará que se almacenen un par de miles de miniaturas en una sola carpeta. Un ejemplo de trabajo se puede encontrar aquí . Haga clic derecho y abra una miniatura en una pestaña nueva, e intente cambiar la babosa para ver cómo funciona.

Espero que esto te haya dado una comprensión más profunda sobre cómo manipular la generación de imágenes en WordPress.

Jack Johansson
fuente