問題描述
介紹。
在上面的屏幕截圖中,您可以看到使用高級插件 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(#替換為 @) 。



