it-swarm.com.de

Ist es möglich, das WordPress-Upload-Verzeichnis neu zu organisieren?

Ich habe eine WordPress-Site, auf der alle Uploads auf /wp-content/uploads/* hochgeladen wurden. Jetzt, da es Tausende von Bildern gibt, gibt es einen Leistungstreffer, und ich wurde beauftragt, bei der Behebung dieses Problems zu helfen.

Hat jemand das Upload-Verzeichnis zuvor neu sortiert? Verschieben Sie es in ein strukturierteres JJJJ/MM? Ich würde gerne Strategien hören, wie dies erreicht wurde.

8
thejimbirch

Leider ist das eine sehr traurige Tatsache über WordPress, es bietet fast keine Anpassung für die Uploads im Back-End (mit Ausnahme der Y/M-Organisation Zeug).

Was Sie tun können, ist, Ihre eigene benutzerdefinierte Klasse zu erstellen, um die Miniaturansichten (die den wichtigsten Teil der Leistungsbeeinträchtigung darstellen, da jedes Bild ein paar bis Dutzende von Miniaturansichten erzeugt) organisierter zu erstellen.

Schritt 1, 2 und 3: Erstellen Sie eine Sicherungskopie aller Ihrer Uploads. Was Sie tun werden, kann nicht rückgängig gemacht werden, es sei denn, Sie haben eine Sicherungskopie Ihres Upload-Ordners!

Schritt 4: Lade das Thumbnail Cleaner Plugin herunter und installiere es. Auf diese Weise können Sie jedes generierte Miniaturbild löschen.

Schritt 5: Erstelle deine eigene Erzeugungsmethode. Ich habe ein Beispiel für dich:

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

Diese Klasse ist fast von der ursprünglichen Klasse in class-wp-image-editor-Gd.php kopiert, mit dem Unterschied, dass die Miniaturansichten in separaten Ordnern gespeichert werden, die sich alle im Upload-Verzeichnis befinden, basierend auf ihrer Größe. Nachdem Sie ein Bild hochgeladen haben, erhalten Sie Folgendes:

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

Dadurch wird verhindert, dass sich eine Million Bilder in einem einzelnen Ordner befinden. Sie können die Klasse wie gewünscht bearbeiten, die Pfade ändern und vieles mehr. Es wurde als Beispiel angegeben, um zu demonstrieren, wie die Bilder erzeugt und gespeichert werden.

Schritt 6: Verwenden Sie Thumbnails neu generieren Plugin, um Ihren Upload-Ordner auf ausgefallene Weise mit neu generierten Thumbnails zu füllen. Auf diese Weise wird verhindert, dass mehrere Tausend Miniaturansichten in einem einzigen Ordner gespeichert werden. Ein funktionierendes Beispiel finden Sie hier . Klicken Sie mit der rechten Maustaste, öffnen Sie eine Miniaturansicht in einem neuen Tab und versuchen Sie, den Slug zu ändern, um zu sehen, wie er funktioniert.

Ich hoffe, dies hat Ihnen ein tieferes Verständnis darüber vermittelt, wie Sie die Bilderzeugung in WordPress manipulieren können.

10
Jack Johansson