简介
在上面的屏幕截图中,您可以看到使用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, 它允许您创建自定义缩略图上载文件夹。请看一下此屏幕截图:
为什么要自定义缩略图文件夹?自定义缩略图文件夹更容易维护,因为在这里,我们不需要维护数据库更新URL,因为缩略图仍然位于相同的位置(RML扩展仍然不会更改)。
如果您想了解有关自定义缩略图生成器的更多信息,可以看看这个线程,我在这里解释了一种技术方法Each custom image size in custom upload directory? .
请继续关注这个主题,因为2017年初我将继续开发RML扩展,它允许RML和服务器上传文件夹之间的同步。该扩展还与Real Thumbnail Generator插件兼容,因此应该有数据库更新。
我的扩展目标目前我在文件夹中“/无组织”,这意味着它是文件夹/wp-content/uploads/。当我将文件(如屏幕截图中所示)移动到PDF/SubDir文件夹时,文件位于visual文件夹中。现在,我的扩展插件检测到与物理文件夹不同的文件夹,并显示一个小“按钮”,允许用户物理移动它:
用户现在单击按钮“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
?>
$元是一个数组:
键“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插件中),他可以撤消移动到原始文件夹的操作。
你觉得这个主意怎么样?有更好的解决方案吗?我希望我已经很好地解释了所有的事情!