是否将缩略图和上传内容存储在不同的目录中?

时间:2017-02-06 作者:Johansson

我已经跟踪了this 问题以自定义方式生成缩略图。

我将图像编辑器类扩展为:

class WP_Image_Editor_Custom extends WP_Image_Editor_GD {
    public function generate_filename($prefix = NULL, $dest_path = NULL, $extension = NULL) {
        // If empty, generate a prefix with the parent method get_suffix().
        if(!$prefix)
            $prefix = $this->get_suffix();

        // Determine extension and directory based on file path.
        $info = pathinfo($this->file);
        $dir  = $info[\'dirname\'];
        $ext  = $info[\'extension\'];

        // Determine image name.
        $name = wp_basename($this->file, ".$ext");

        // Allow extension to be changed via method argument.
        $new_ext = strtolower($extension ? $extension : $ext);

        // Default to $_dest_path if method argument is not set or invalid.
        if(!is_null($dest_path) && $_dest_path = realpath($dest_path))
            $dir = $_dest_path;

        // Return our new prefixed filename.
        return trailingslashit($dir)."{$prefix}/{$name}.{$new_ext}";
    }
function multi_resize($sizes) {
    $sizes = parent::multi_resize($sizes);
    //This will generate proper metadata for thumbnails
    foreach($sizes as $slug => $data)
        $sizes[$slug][\'file\'] = $slug."/".$data[\'file\'];

    return $sizes;
}
}
现在,原始上传将存储在uploads 缩略图将存储在uploads/thumbnail/, /uploads/medium/uploads/large/.

我想要的是以下两种场景之一:

1- 将原始上载存储在子文件夹中,如uploads/original 还有缩略图uploads/thumbnail/, /uploads/medium/uploads/large/.

2- 将原始图像存储在uploads/ 以及名为thumbs/, 在上载目录之外的根目录中。

然而,当我调用一个函数,如wp_get_attachment_image_src() 它会将我的自定义缩略图链接(存储在post元数据中)附加到上载目录,生成如下链接:

http://example.com/uploads/thumbs/medium/image.jpg

正确的格式必须如下所示:

http://example.com/thumbs/medium/image.jpg

调用指向正确文件时是否可以覆盖元数据??

2 个回复
最合适的回答,由SO网友:Johansson 整理而成

缩略图URL似乎是相对于上载文件夹生成的。因此,尝试将它们存储在uploads文件夹之外并不是一个好主意。

有一些黑客可以过滤输出中的函数,例如the_post_thumbnail_url(), 但考虑到诸如缩略图无法删除之类的次要问题,不值得一试。

我能够实现的是,将生成的缩略图存储在uploads文件夹内的另一个子目录中,然后通过在.htaccess 文件,以防您想要保护它们不被访问者访问,从而禁止直接访问它们。

我可以在wp-image-editor-gd.php 将缩略图存储在子目录中。以下是如何做到这一点:

首先,我们将自己的类设置为主图像生成器:

add_filter(\'wp_image_editors\', \'custom_wp_image_editors\');
function custom_wp_image_editors($editors) {
    array_unshift($editors, "custom_WP_Image_Editor");
    return $editors;
}
然后,我们将包括需要扩展的必要类:

require_once ABSPATH . WPINC . "/class-wp-image-editor.php";
require_once ABSPATH . WPINC . "/class-wp-image-editor-gd.php";
最后设置路径:

class custom_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
        $size_from_suffix = explode("x", $suffix);
        return trailingslashit( $dir ) . "{$size_from_suffix[0]}/{$name}.{$new_ext}";
    }
}
现在,缩略图将根据其宽度存储在不同的子文件夹中。例如:

/wp-content/uploads/150/example.jpg
/wp-content/uploads/600/example.jpg
/wp-content/uploads/1024/example.jpg
等等。

可能的问题

现在,当我们上载小于最小缩略图大小的图像时,可能会出现问题。例如,如果我们上传图像,大小100x100最小缩略图大小为150x150, 将在上载目录中创建另一个文件夹。这可能会导致上载目录中有许多子目录。我用另一种方法解决了这个问题this 问题

SO网友:user6552940

2-将原始图像存储在uploads/中,并将缩略图存储在名为thumbs/的文件夹中,位于上载目录之外的根目录中。

接下来是第二个场景,因为您已经完成了一半。您可以使用以下选项:

        add_filter( \'wp_get_attachment_image_src\', function ( $image, $attachment_id, $size ) {

        // Make sure $image is not false.
        if ( $image ) {
            switch ( $size ) {
                // Add your custom sizes as cases here.
                case \'thumbnail\':
                case \'medium\':
                case \'large\':
                case \'mysize\':
                    /*
                     * This will simply convert the link from
                    http://example.com/uploads/thumbs/medium/image.jpg
                    to
                    http://example.com/thumbs/medium/image.jpg
                    only for thumbnails not for original images.
                    */
                    $image[0] = str_replace( \'/uploads/\', \'/\', $image[0] );
                    break;
                default:
                    break;
            }
        }

        return $image;
    }, 10, 3 );
我希望这对你有帮助。

相关推荐

Thumbnails Not Generating

好啊所以这是一个奇怪的问题。。。WordPress不生成缩略图,我设置了图像大小和所有内容。。。我很确定这与我的自定义帖子类型代码有关(见下文),因为当我删除它时,缩略图会正确生成。// Tells WP to add a slides and marquee sections add_action( \'init\', \'create_my_post_types\' ); // WP slides section attributes function create_