Apakah mungkin untuk mengatur ulang direktori upload WordPress?

8

Saya memiliki situs WordPress tempat semua unggahan telah diunggah /wp-content/uploads/*. Sekarang ada ribuan gambar, ada hit kinerja, dan saya telah ditugaskan untuk membantu memperbaikinya.

Adakah yang mengurutkan ulang direktori unggahan sebelumnya? Memindahkannya ke YYYY / MM yang lebih terstruktur? Saya ingin mendengar beberapa strategi tentang bagaimana ini dicapai.

thejimbirch
sumber

Jawaban:

10

Sayangnya itu fakta yang sangat menyedihkan tentang WordPress, hampir tidak ada penyesuaian untuk unggahan di back-end (kecuali hal-hal organisasi y / m).

Yang dapat Anda lakukan, adalah membuat kelas khusus Anda sendiri untuk menghasilkan thumbnail (yang merupakan bagian paling penting dari dampak kinerja, karena setiap gambar menghasilkan beberapa hingga puluhan thumbnail) dengan cara yang lebih terorganisir.

Langkah 1,2 dan 3: Buat cadangan dari semua unggahan Anda. Apa yang akan Anda lakukan tidak dapat dibatalkan kecuali Anda memiliki cadangan folder unggahan Anda!

Langkah 4: Unduh dan pasang plugin Thumbnail Cleaner . Ini memungkinkan Anda untuk menghapus setiap thumbnail yang dihasilkan.

Langkah 5: Buat metode generasi Anda sendiri. Saya punya contoh untuk Anda:

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

Kelas ini hampir disalin dari kelas asli yang termasuk dalam class-wp-image-editor-gd.php, dengan satu perbedaan: Ini akan menyimpan thumbnail di folder yang terpisah, semua di dalam direktori unggahan berdasarkan ukuran siput mereka. Jadi setelah Anda mengunggah gambar, Anda akan berakhir dengan sesuatu seperti ini:

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

Ini akan mencegah memiliki jutaan gambar di dalam satu folder. Anda dapat mengedit kelas seperti yang Anda inginkan, mengubah jalur, dan banyak lagi. Itu diberikan sebagai contoh untuk menunjukkan bagaimana gambar dihasilkan dan disimpan.

Langkah 6: Gunakan Regenerate Thumbnails Plugin untuk mengisi folder unggahan Anda dengan thumbnail yang baru dibuat, dengan cara yang mewah. Ini akan mencegah beberapa ribu gambar kecil semua disimpan dalam satu folder. Contoh kerja dapat ditemukan di sini . Klik kanan dan buka thumbnail di tab baru, dan coba ubah siput untuk melihat cara kerjanya.

Saya harap ini memberi Anda pemahaman yang lebih dalam tentang bagaimana memanipulasi pembuatan gambar di WordPress.

Jack Johansson
sumber