Est-il possible de réorganiser le répertoire de téléchargement de WordPress?

8

J'ai un site WordPress sur lequel tous les téléchargements ont été téléchargés /wp-content/uploads/*. Maintenant qu'il y a des milliers d'images, il y a un problème de performance, et j'ai été chargé d'aider à y remédier.

Quelqu'un a-t-il déjà trié le répertoire des téléchargements auparavant? Le déplacer dans un AAAA / MM plus structuré? Je serais ravi d'entendre quelques stratégies sur la façon dont cela a été réalisé.

thejimbirch
la source

Réponses:

10

Malheureusement, c'est un fait très triste à propos de WordPress, il ne fournit presque aucune personnalisation pour les téléchargements dans le back-end (sauf les éléments d'organisation y / m).

Ce que vous pouvez faire, c'est de créer votre propre classe personnalisée pour générer les vignettes (qui sont la partie la plus importante de l'impact sur les performances, car chaque image génère de quelques à des dizaines de vignettes) de manière plus organisée.

Étape 1, 2 et 3: effectuez une sauvegarde de tous vos téléchargements. Ce que vous allez faire ne peut être inversé que si vous avez une sauvegarde de votre dossier de téléchargement!

Étape 4: Téléchargez et installez le plug-in Thumbnail Cleaner . Cela vous permet de supprimer chaque miniature générée.

Étape 5: Créez votre propre méthode de génération. J'ai un exemple pour vous:

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

Cette classe est presque copiée à partir de la classe d'origine incluse dans class-wp-image-editor-gd.php, avec une différence: elle stockera les miniatures dans des dossiers séparés, tous à l'intérieur du répertoire de téléchargement en fonction de leur taille. Donc, après avoir téléchargé une image, vous vous retrouverez avec quelque chose comme ceci:

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

Cela évitera d'avoir un million d'images dans un seul dossier. Vous pouvez modifier la classe comme vous le souhaitez, modifier les chemins d'accès, etc. Il a été fourni à titre d'exemple pour montrer comment les images sont générées et stockées.

Étape 6: Utilisez le plug- in Regenerate Thumbnails pour remplir votre dossier de téléchargements avec des miniatures nouvellement générées, de manière sophistiquée. Cela empêchera que quelques milliers de miniatures soient toutes stockées dans un seul dossier. Un exemple de travail peut être trouvé ici . Cliquez avec le bouton droit et ouvrez une miniature dans un nouvel onglet, et essayez de changer le slug pour voir comment cela fonctionne.

J'espère que cela vous a permis de mieux comprendre comment manipuler la génération d'images dans WordPress.

Jack Johansson
la source