WordPress媒体库的物理组织(Real Media Library插件)

时间:2016-05-15 作者:Matthias Günter

Real Media Library folder structure

简介

在上面的屏幕截图中,您可以看到使用premium插件构建的文件夹结构Real Media Library. 现在我想创建一个扩展插件,可以将文件夹结构组织到physical folder structure - RML只是视觉结构。

更新#2(2017-01-27):查看答案

看看Physical organization of wordpress media library (Real Media Library plugin) 我在那里创建了一个免费的扩展插件。

更新#1(2016-12-14):第一次成功:自定义缩略图上载文件夹现在,我创建了另一个插件Real Thumbnail Generator, 它允许您创建自定义缩略图上载文件夹。请看一下此屏幕截图:

Real Thumbnail Generator Upload folder

为什么要自定义缩略图文件夹?自定义缩略图文件夹更容易维护,因为在这里,我们不需要维护数据库更新URL,因为缩略图仍然位于相同的位置(RML扩展仍然不会更改)。

如果您想了解有关自定义缩略图生成器的更多信息,可以看看这个线程,我在这里解释了一种技术方法Each custom image size in custom upload directory? .

请继续关注这个主题,因为2017年初我将继续开发RML扩展,它允许RML和服务器上传文件夹之间的同步。该扩展还与Real Thumbnail Generator插件兼容,因此应该有数据库更新。

我的扩展目标

目前我在文件夹中“/无组织”,这意味着它是文件夹/wp-content/uploads/。当我将文件(如屏幕截图中所示)移动到PDF/SubDir文件夹时,文件位于visual文件夹中。现在,我的扩展插件检测到与物理文件夹不同的文件夹,并显示一个小“按钮”,允许用户物理移动它:

Button to physix it

用户现在单击按钮“Physix it!”文件应移动到/wp-content/uploads/pdfs/subdir/Another-Doc.pdf. 我已经创建了移动过程:我读取了此附件的所有媒体文件(包括图像缩略图),并使用php函数rename($old_file, $new_file) 连同WP功能wp_mkdir_p(). The GUID in the wp_posts table and the meta data in wp_postmeta is changed, too. 移动所有文件时,我调用该操作:

<?php
do_action(\'RML/Physix/Moved\', $meta, $id);
// $meta = Infos about the move process, see above screenshot
// $id = The attachment ID
?>
$元是一个数组:

enter image description here

键“rename”包含所有重命名过程(例如,这里可以是图像的缩略图文件)。

问题是:保证插件兼容性

WordPress媒体库的主要问题(如果是的话)是,许多插件使用完整URL而不是附件ID保存对图像的引用。这意味着,有些MySQL表的列包含指向给定文件的URL。我怎样才能保证references are up-to-date 使用物理文件夹?我认为这是不可能的。

一种可能的方法

我加入到操作中并更新标准表,如wp\\u post->post\\u content。。。使用SQL中的递归REPLACE语句。

<?php    
/**
 * When a attachment is moved.
 * 
 * @hooked RML/Physix/Moved
 */
function physix_moved($meta, $id) {
    $rename = $meta["rename"];

    // Prepare array for recursive REPLACE
    $arr = array();
    foreach ($rename as $value) {
        $arr[] = array($value["old_url"], $value["new_url"]);
    }
    $rec = $this->recReplace($arr, "post_content"); // function is already finished
}
?>
$rec变量现在是REPLACE语句:

REPLACE(post_content, \'https://example.io/wp-content/uploads/Another-Doc.pdf\', \'https://example.io/wp-content/uploads/pdfs/subdir/Another-Doc.pdf\')
顺便说一下:对于包含所有缩略图文件的图像(testimage.jpg),它可以如下所示:

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(post_content, \'https://example.io/wp-content/uploads/testimage-750x350.jpg\', \'https://example.io/wp-content/uploads/pdfs/subdir/testimage-750x350.jpg\'), \'https://example.io/wp-content/uploads/testimage-1170x855.jpg\', \'https://example.io/wp-content/uploads/pdfs/subdir/testimage-1170x855.jpg\'), \'https://example.io/wp-content/uploads/testimage-256x187.jpg\', \'https://example.io/wp-content/uploads/pdfs/subdir/testimage-256x187.jpg\'), \'https://example.io/wp-content/uploads/testimage-1024x748.jpg\', \'https://example.io/wp-content/uploads/pdfs/subdir/testimage-1024x748.jpg\'), \'https://example.io/wp-content/uploads/testimage-300x219.jpg\', \'https://example.io/wp-content/uploads/pdfs/subdir/testimage-300x219.jpg\'), \'https://example.io/wp-content/uploads/testimage-150x150.jpg\', \'https://example.io/wp-content/uploads/pdfs/subdir/testimage-150x150.jpg\'), \'https://example.io/wp-content/uploads/testimage.jpg\', \'https://example.io/wp-content/uploads/pdfs/subdir/testimage.jpg\')
但是,如果它是数据库表中的序列化字符串(JSON),会发生什么呢?所以看起来{ "image": "http:\\/\\/example.io\\/wp-content\\/uploads\\/Another-Doc.pdf" }. 我必须向REPLACE语句添加什么?

REPLACE语句现在可以在包含图像URL的所有MySQL表中使用。我考虑创建一个过滤器阵列,插件可以在其中添加它们的表,剩下的工作由我的扩展来完成:

<?php
$tables = apply_filters("RML/Physix/Moved/Tables", array( // TODO: use $wpdb->prefix
    "wp_posts" => array("post_excerpt", "post_content"),
    "wp_postmeta" => array("meta_value")
    //...
));
?>
“移动”日志我想创建一个“日志”,用户可以在其中撤消移动。如果用户看到图像被破坏(例如在Slider Revolution插件中),他可以撤消移动到原始文件夹的操作。

你觉得这个主意怎么样?有更好的解决方案吗?我希望我已经很好地解释了所有的事情!

1 个回复
最合适的回答,由SO网友:Matthias Günter 整理而成

免费解决方案扩展“物理自定义上载文件夹”

很久以前,我开始打开此线程,现在有一个适用于Real Media Library的扩展插件,允许您physically manage your uploads folder.

enter image description here

查看此插件:https://wordpress.org/plugins/physical-custom-upload-folder/

您知道wp content/uploads文件夹吗?在那里,文件存储在基于年/月的文件夹中。这可能是一个非常复杂和大规模的过程,尤其是当您使用像FileZilla这样的FTP客户端时。

Moving already uploaded files: 当您在Real Media Library中移动文件时,此插件不允许物理移动文件,因为WordPress在不同的位置使用URL。很难维持这样一个过程。因此,这只适用于新上载。