È possibile riorganizzare la directory dei caricamenti di WordPress?


8

Ho un sito WordPress in cui sono stati caricati tutti i caricamenti /wp-content/uploads/*. Ora che ci sono migliaia di immagini, c'è un successo prestazionale e mi è stato assegnato il compito di rimediare.

Qualcuno ha riordinato la directory dei caricamenti prima? Spostandolo in un AAAA / MM più strutturato? Mi piacerebbe sentire alcune strategie su come questo è stato raggiunto.

Risposte:


10

Sfortunatamente questo è un fatto molto triste su WordPress, non fornisce quasi alcuna personalizzazione per i caricamenti nel back-end (tranne le cose dell'organizzazione y / m).

Quello che puoi fare è creare la tua classe personalizzata per generare le miniature (che sono la parte più importante dell'impatto sulle prestazioni, dal momento che ogni immagine genera da poche a decine di miniature) in un modo più organizzato.

Passaggio 1,2 e 3: esegui un backup di tutti i tuoi caricamenti. Quello che stai per fare non può essere annullato se non hai un backup della cartella dei tuoi caricamenti!

Passaggio 4: scaricare e installare il plug-in Thumbnail Cleaner . Ciò consente di eliminare ogni miniatura generata.

Passaggio 5: crea il tuo metodo di generazione. Sto avendo un esempio per te:

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;
    }
}

Questa classe viene quasi copiata dalla classe originale inclusa class-wp-image-editor-gd.php, con una differenza: memorizzerà le anteprime in cartelle separate, tutte all'interno della directory dei caricamenti in base alla loro dimensione. Quindi dopo aver caricato un'immagine, ti ritroverai con qualcosa del genere:

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

Ciò impedirà di avere un milione di immagini all'interno di una singola cartella. È possibile modificare la classe nel modo desiderato, modificare i percorsi e altro. È stato fornito come esempio per dimostrare come le immagini vengono generate e archiviate.

Passaggio 6: utilizzare il plug-in Rigenerate miniature per riempire la cartella dei caricamenti con miniature appena generate, in modo elegante. Ciò eviterà che un paio di migliaia di miniature vengano archiviate in un'unica cartella. Un esempio funzionante può essere trovato qui . Fai clic con il pulsante destro del mouse e apri una miniatura in una nuova scheda e prova a cambiare la lumaca per vedere come funziona.

Spero che questo ti abbia dato una comprensione più profonda di come manipolare la generazione di immagini in WordPress.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.