Có thể tổ chức lại thư mục tải lên WordPress?


8

Tôi có một trang web WordPress nơi tất cả các tải lên đã được tải lên /wp-content/uploads/*. Bây giờ có hàng ngàn hình ảnh, có một hiệu suất thành công và tôi đã được chỉ định để giúp khắc phục nó.

Có ai đã sắp xếp lại thư mục tải lên trước đây chưa? Di chuyển nó thành một YYYY / MM có cấu trúc hơn? Tôi muốn nghe một số chiến lược về cách đạt được điều này.

Câu trả lời:


10

Thật không may, đó là một thực tế rất đáng buồn về WordPress, nó hầu như không cung cấp tùy chỉnh cho các video tải lên ở phía sau (ngoại trừ công cụ tổ chức y / m).

Những gì bạn có thể làm là tạo lớp tùy chỉnh của riêng bạn để tạo hình thu nhỏ (là phần quan trọng nhất của tác động hiệu suất, vì mỗi hình ảnh tạo ra một vài đến hàng chục hình thu nhỏ) theo cách có tổ chức hơn.

Bước 1,2 và 3: Tạo bản sao lưu tất cả các video tải lên của bạn. Những gì bạn sẽ làm không thể đảo ngược trừ khi bạn có một bản sao lưu của thư mục tải lên của bạn!

Bước 4: Tải xuống và cài đặt plugin Thumbnail Cleaner . Điều này cho phép bạn xóa mọi hình thu nhỏ được tạo.

Bước 5: Tạo phương thức tạo thế hệ của riêng bạn. Tôi đang có một ví dụ cho bạn:

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

Lớp này gần như được sao chép từ lớp ban đầu được bao gồm class-wp-image-editor-gd.php, với một điểm khác biệt: Nó sẽ lưu trữ các hình thu nhỏ trong các thư mục riêng biệt, tất cả bên trong thư mục tải lên dựa trên sên kích thước của chúng. Vì vậy, sau khi bạn tải lên một hình ảnh, bạn sẽ kết thúc với một cái gì đó như thế này:

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

Điều này sẽ ngăn không có một triệu hình ảnh trong một thư mục. Bạn có thể chỉnh sửa lớp theo cách bạn muốn, thay đổi đường dẫn và hơn thế nữa. Nó được cung cấp như một ví dụ để chứng minh làm thế nào các hình ảnh được tạo và lưu trữ.

Bước 6: Sử dụng Plugin Regenerate Thumbnails để điền vào thư mục tải lên của bạn với các hình thu nhỏ mới được tạo, theo cách lạ mắt. Điều này sẽ ngăn một vài ngàn hình thu nhỏ được lưu trữ trong một thư mục. Một ví dụ làm việc có thể được tìm thấy ở đây . Nhấp chuột phải và mở hình thu nhỏ trong tab mới và thử thay đổi sên để xem nó hoạt động như thế nào.

Tôi hy vọng điều này đã cho bạn hiểu sâu hơn về cách thao tác tạo hình ảnh trong WordPress.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.