简介。
在上面的屏幕截图中,您可以看到使用高级插件Real Media Library构建的文件夹结构。现在我想创建一个扩展插件,该插件可以将文件夹结构组织为物理文件夹结构-RML只是视觉结构。
更新#2(2017-01-27):找出答案!
看看我创建了免费扩展插件的wordpress媒体库的物理组织(Real Media Library插件)。
更新#1(2016-12-14) :第一次成功:自定义缩略图上传文件夹
现在,我创建了另一个插件Real Thumbnail Generator,该插件可让您创建自定义缩略图上传文件夹。只需看一下以下屏幕截图:
为什么自定义缩略图文件夹?自定义缩略图文件夹更易于维护,因为在这里,我们不需要维护数据库更新URL,因为缩略图仍位于同一位置(RML扩展名仍未更改)。
如果您想了解有关自定义缩略图生成器的更多信息,可以查看此线程,在这里我已经解释了一种技术方法自定义上传目录中的每个自定义图像大小? 。
请继续关注这个话题,因为从2017年初开始,我将继续开发RML扩展程序,该扩展程序允许RML和服务器上载文件夹之间进行同步。该扩展程序还与Real Thumbnail Generator插件兼容,因此应该进行数据库更新。
我的扩展目标
我的扩展目标。
当我进入文件夹“ / Unorganized”时,这意味着它是文件夹/ wp-content / uploads /。当我将文件(如屏幕截图所示)移动到PDFs / SubDir文件夹时,该文件位于可视文件夹中。现在,我的扩展程序检测到与实际文件夹不同的文件夹,并显示一个小“按钮”,该按钮也允许用户实际移动它:
用户现在单击“ Physix it!”按钮。并将文件移至/wp-content/uploads/pdfs/subdir/Another-Doc.pdf。我已经创建了移动过程:我读出了此附件的所有媒体文件(包括图像的缩略图),并将php函数named($ old_file,$ new_file)与WP函数wp_mkdir_p()一起使用。 wp_posts表中的GUID和wp_postmeta中的元数据也已更改。当所有文件都移动后,我将调用操作:
<?php
do_action('RML/Physix/Moved', $meta, $id);
// $meta = Infos about the move process, see above screenshot
// $id = The attachment ID
?>
$ meta是一个数组:
键“重命名”包含所有重命名过程(例如,此处可以是图像的缩略图文件)。
问题:保证插件兼容性。
主要问题(如果是)WordPress媒体库是,那么许多插件会将对引用的引用保存为具有完整URL而不是附件ID的图像。这意味着,存在带有列的MySQL表,这些列包含指向给定文件的URL。如何保证所有引用与物理文件夹都是最新的?我认为这是不可能的。
一种可行的方法。
我加入了动作,并使用递归REPLACE-更新了wp_post-> post_content等标准表。 SQL中的语句。
<?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-Statement中添加什么?现在,可以在包含图像URL的所有MySQL表中使用REPLACE-Statement。我考虑过要创建一个过滤器数组,插件可以在其中添加表,其余的扩展工作由我完成:
<?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 楼
免费的解决方案扩展“ Physical Custom Upload Folder”很久以前,我开始打开此线程,现在有一个Real Media Library可用的扩展插件,允许您物理管理上传文件夹。 br />
签出此插件:https://wordpress.org/plugins/physical-custom-upload-folder/
你知道吗wp-content / uploads文件夹?在那里,文件存储在基于年/月的文件夹中。这可能是一个非常复杂且繁琐的过程,尤其是在使用FileZilla这样的FTP客户端时。
移动已上传的文件:此插件不允许在移动文件时实际移动文件在Real Media Library中,因为WordPress在不同的地方使用了URL。维持这样的过程非常困难。因此,这仅适用于新上传的内容。
评论
您并不是要看到附件的文件夹结构,在许多情况下,它们是没有的(也许文件甚至不在服务器上?S3 AWS CDN等),WordPress处理附件中的帖子,而不是附件文件,以及在服务器上移动它们会适得其反。您最好使用自定义分类法和重写规则来触发重定向尽管这是一个关于清晰度/质量(+1的努力)的极好的问题,但最终我们还是在这里处理了一个第三方插件,这被认为是题外话-我认为没有人能够做到“快速”为您提供帮助,而无需认真投资RML。
@TheDeadMedic是的,这是正确的。但是我问这个问题的方式是,您知道它如何与RML中的动作一起工作。这个问题不是RML特定的,而是数据库特定的-如何解决url替换的问题。
再加上+1的努力–希望我们能有更多这样的问题……就像我们在早期那样。无论如何,上面概述了主要问题。提出您的观点:能否请您进行编辑并解释您尝试的原因?到目前为止,执行这些文件系统任务没有任何意义。
您如何处理这个@MatthiasGünter的?您设法找到解决方案了吗?