Answers:
不幸的是,关于WordPress这是一个非常可悲的事实,它几乎没有为后端的上传提供自定义功能(y / m组织的东西除外)。
您可以做的是,使您自己的自定义类以更有条理的方式生成缩略图(这是性能影响中最重要的部分,因为每个图像都会生成几十到几十个缩略图)。
步骤1,2和3:备份所有上载内容。除非您有上载文件夹的备份,否则您将无法撤消的准备!
步骤4:下载并安装Thumbnail Cleaner插件。这使您可以删除每个生成的缩略图。
步骤5:创建自己的生成方法。我有一个例子供您参考:
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;
}
}
该类几乎是从中包含的原始类复制而来的class-wp-image-editor-gd.php
,只有一个区别:它将根据缩略图的大小将缩略图存储在单独的文件夹中,所有文件夹都位于上载目录中。因此,上传图片后,您将得到如下所示的结果:
/uploads/image.jpg
/uploads/thumbnail/image.jpg
/uploads/medium/image.jpg
/uploads/large/image.jpg
// And so on...
这样可以防止单个文件夹中包含一百万张图像。您可以按照自己的方式编辑类,更改路径等等。它作为示例演示了如何生成和存储图像。
步骤6:使用重新生成缩略图插件,以一种新颖的方式用新生成的缩略图填充您的上载文件夹。这样可以防止将数千个缩略图全部存储在一个文件夹中。一个有效的例子可以在这里找到。右键单击并在新选项卡中打开缩略图,然后尝试更改该段塞以查看其工作原理。
我希望这能使您对如何在WordPress中操纵图像生成有更深入的了解。