Введение.
На скриншоте выше вы можете увидеть структуру папок, созданную с помощью премиального плагина Real Media Library . Теперь я хочу создать плагин расширения, который может организовать структуру папок в физическую структуру папок - RML - это только визуальная структура.
Обновление № 2 (2017-01-27): Проверьте ответ!
Взгляните на Физическую организацию WordPress Media Library (плагин 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 ($ old_file, $ new_file) вместе с функцией WP wp_mkdir_p () . GUID в таблице wp_posts и метаданные в 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-адресами вместо идентификатора вложения. Это означает, что существуют таблицы MySQL со столбцами, которые содержат URL-адрес указанного файла. Как я могу гарантировать, что ВСЕ ссылки актуальны для физических папок? Думаю это невозможно.
Один из возможных подходов.
Я подключаюсь к действию и обновляю стандартные таблицы, такие как wp_post-> post_content , ... с помощью рекурсивного оператора REPLACE в 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 теперь можно использовать во всех таблицах MySQL, содержащих URL-адреса изображений. Я думал о создании массива фильтров, где плагины могут добавлять свои таблицы, а мое расширение сделает все остальное:
<?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), он может отменить перемещение в исходную папку.
Что вы думаете об этой идее? Есть ли лучшее решение? Надеюсь, я все хорошо объяснил!