Физическая организация библиотеки WordPress Media (плагин Real Media Library)

22

Структура папок Real Media Library

Введение.

На скриншоте выше вы можете увидеть структуру папок, созданную с помощью премиального плагина Real Media Library . Теперь я хочу создать плагин расширения, который может организовать структуру папок в физическую структуру папок - RML - это только визуальная структура.

Обновление № 2 (2017-01-27): Проверьте ответ!

Взгляните на Физическую организацию WordPress Media Library (плагин Real Media Library), где я создал бесплатный плагин расширения.

Обновление № 1 (2016-12-14): первый успех: папка для загрузки пользовательских миниатюр

Теперь я создал еще один плагин Real Thumbnail Generator , который позволяет создавать пользовательские папки для загрузки миниатюр. Просто посмотрите на этот скриншот:

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), он может отменить перемещение в исходную папку.

Что вы думаете об этой идее? Есть ли лучшее решение? Надеюсь, я все хорошо объяснил!

Матиас Гюнтер
источник
9
Вы не должны видеть структуру папок, лежащих в основе вложений, во многих случаях их нет (возможно, файлов даже нет на сервере? S3 AWS CDN и т. Д.), WordPress работает с сообщениями вложений, а не с файлами вложений, и перемещение их на сервере является контрпродуктивным. Было бы лучше сделать это с помощью пользовательской таксономии и переписать правила, которые запускают перенаправление
Том Дж. Новелл
5
Хотя это отличный вопрос с точки зрения ясности / качества (+1 за усилие), в конечном итоге мы имеем дело с сторонним плагином, который считается не по теме - я не думаю, что кто-то сможет «быстро» поможет вам без серьезных инвестиций в RML.
TheDeadMedic
@TheDeadMedic Да, это правда. Но я задал вопрос так, чтобы вы знали, как это работает с действиями в RML. Этот вопрос не является специфичным для RML, он более специфичен для базы данных - как решить проблему с заменой URL.
Матиас Гюнтер
2
И еще один +1 за усилия - хотелось бы, чтобы у нас было больше таких вопросов ... как у нас было в первые дни. Во всяком случае, основные проблемы изложены выше. Чтобы сделать вашу точку зрения: Не могли бы вы подать редактирование и объяснить причины того, что вы пытаетесь? Пока что нет смысла выполнять эти задачи файловой системы.
Кайзер
Как ты прошел с этим @ MatthiasGünter? Вам удалось найти решение?
Тим Мэлоун

Ответы:

1

Бесплатное решение для расширения "Физическая пользовательская папка загрузки"

Давным-давно я начал открывать эту тему, и теперь есть плагин расширения для Real Media Library, который позволяет вам физически управлять папкой для выгрузки .

введите описание изображения здесь

Проверьте этот плагин: https://wordpress.org/plugins/physical-custom-upload-folder/

Вы знаете папку wp-content / uploads? Там файлы хранятся в папках на основе года / месяца. Это может быть очень сложным и массовым процессом, особенно когда вы работаете с FTP-клиентом, таким как FileZilla.

Перемещение уже загруженных файлов: этот плагин не позволяет физически перемещать файлы при перемещении файла в библиотеке Real Media, поскольку WordPress использует URL-адреса в разных местах. Очень трудно поддерживать такой процесс. Так что это работает только для новых загрузок.

Матиас Гюнтер
источник