问题描述

介绍。

在上面的屏幕截图中,您可以看到使用高级插件 Real Media Library 构建的文件夹结构。现在我想创建一个可以将文件夹结构组织成物理文件夹结构的扩展插件–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 /。当我将文件 (在屏幕截图中可以看到) 移动到文件夹 PDFs /SubDir 时,该文件在可视文件夹中。现在我的扩展检测到不同的物理文件夹,并显示一个”button”,它允许用户物理地移动它:

用户现在点击按钮 「Physix it!」 该文件应移动到/wp-content/uploads/pdfs/subdir/Another-Doc.pdf 。我已经创建了移动过程:我读出了这个附件的所有媒体文件 (包含图像的缩略图),并使用 php 函数 rename($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 是一个数组:

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

问题:保证插件的兼容性。

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

一种可能的方法

我钩住了这个动作,并在 SQL 中使用递归的 REPLACE-statement 来更新诸如 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")
    //...
));
?>

“move” 日志

我想创建一个”log”,用户可以在其中撤消移动。如果用户看到,图像被破坏 (例如在 Slider Revolution 插件中),他可以撤消移动到原始文件夹。

你对这个想法有什么看法?有更好的解决方案吗?我希望我有一个很好的解释方式!

参考文献

注:本文内容整合自 google/baidu/bing 翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为 @) 。