介绍。
在上面的屏幕截图中,您可以看到使用高级插件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。如何保证所有引用与物理文件夹都是最新的?我认为这是不可能的。
一种可能的方法。
我加入了该动作,并使用SQL中的递归REPLACE语句更新了标准表,如wp_post-> post_content,...。
<?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-Statement:
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插件中),则可以撤消对原始文件夹的移动。
您如何看待这个想法?有更好的解决方案吗?我希望我已经用一种很好的方式解释了一切!