it-swarm.com.de

Physische Organisation der WordPress-Mediathek (Real Media Library-Plugin)

 Real Media Library folder structure 

Einführung.

Im obigen Screenshot sehen Sie eine Ordnerstruktur, die mit dem Premium-PluginReal Media Libraryerstellt wurde. Jetzt möchte ich ein Erweiterungs-Plugin erstellen, das die Ordnerstruktur in physische Ordnerstruktur - gliedert. RML ist nur eine visuelle Struktur.

Update Nr. 2 (2017-01-27): Überprüfen Sie die Antwort!

Werfen Sie einen Blick auf Physische Organisation der WordPress-Mediathek (Real Media Library-Plugin) wo ich ein kostenloses Erweiterungs-Plugin erstellt habe.

Update Nr. 1 (14.12.2016): Der erste Erfolg: Benutzerdefinierter Ordner zum Hochladen von Miniaturansichten

Jetzt habe ich ein weiteres PluginReal Thumbnail Generatorerstellt, mit dem Sie einen benutzerdefinierten Ordner zum Hochladen von Miniaturansichten erstellen können. Schauen Sie sich einfach diesen Screenshot an:

 Real Thumbnail Generator Upload folder 

Warum benutzerdefinierte Miniaturordner? Benutzerdefinierte Ordner mit Miniaturansichten sind einfacher zu verwalten, da hier die URLs für die Datenbankaktualisierung nicht verwaltet werden müssen, da sich die Miniaturansichten immer noch am selben Speicherort befinden (der von der RML-Erweiterung immer noch nicht geändert wird).

Wenn Sie mehr über den benutzerdefinierten Thumbnail-Generator erfahren möchten, können Sie sich diesen Thread ansehen, in dem ich einen technischen Ansatz erläutert habe Jede benutzerdefinierte Bildgröße im benutzerdefinierten Upload-Verzeichnis? .

Bitte bleiben Sie in diesem Thread, da ich Anfang 2017 die Entwicklung der RML-Erweiterung fortsetzen werde, die die Synchronisierung zwischen RML und dem Server-Upload-Ordner ermöglicht. Die Erweiterung ist auch mit dem Real Thumbnail Generator-Plugin kompatibel, daher sollte das Datenbank-Update vorhanden sein.

Ursprünglicher Beitrag

Mein Verlängerungsziel.

Im Moment bin ich im Ordner "/ Unorganized", dh es ist der Ordner/wp-content/uploads /. Wenn ich die Datei (wie Sie im Screenshot sehen können) in den Ordner PDFs/SubDir verschiebe, befindet sich die Datei im visuellen Ordner. Jetzt erkennt meine Erweiterung den anderen Ordner als den physischen und zeigt eine kleine Schaltfläche, mit der der Benutzer ihn auch physisch verschieben kann:

 Button to physix it 

Der Benutzer klickt nun auf den Button "Physix it!" und die Datei sollte nach /wp-content/uploads/pdfs/subdir/Another-Doc.pdf verschoben werden. Ich habe den Verschiebevorgang bereits erstellt: Ich habe alle Mediendateien für diesen Anhang (inklusive Thumbnails für Bilder) ausgelesen und benutze die PHP-Funktion Rename ($ old_file, $ new_file) zusammen mit der Funktion WP wp_mkdir_p () . Die GUID in der wp_posts -Tabelle und die Metadaten in wp_postmeta werden ebenfalls geändert. Wenn alle Dateien verschoben sind, rufe ich die Aktion auf:

<?php
do_action('RML/Physix/Moved', $meta, $id);
// $meta = Infos about the move process, see above screenshot
// $id = The attachment ID
?>

$ meta ist ein Array:

 enter image description here 

Der Schlüssel "Umbenennen" enthält alle Umbenennungsvorgänge (hier können zum Beispiel die Thumbnail-Dateien für Bilder sein).

Das Problem: Plugin-Kompatibilität sicherstellen.

Das Hauptproblem der WordPress-Medienbibliothek besteht darin, dass viele Plugins die Verweise auf Bilder mit vollständigen URLs anstelle der Anhangs-ID speichern. Das heißt, es gibt MySQL-Tabellen mit Spalten, die eine URL zu der angegebenen Datei enthalten. Wie kann ich garantieren, dass ALLE Referenzen aktuell sind mit den physischen Ordnern? Ich denke es ist unmöglich.

Ein möglicher Ansatz.

Ich greife in die Aktion ein und aktualisiere die Standardtabellen wie wp_post-> post_content, ... mit einer rekursiven REPLACE-Anweisung in 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
}
?>

Die Variable $ rec ist jetzt eine REPLACE-Anweisung:

REPLACE(post_content, 'https://example.io/wp-content/uploads/Another-Doc.pdf', 'https://example.io/wp-content/uploads/pdfs/subdir/Another-Doc.pdf')

Übrigens: Für ein Bild (testimage.jpg) mit allen Thumbnail-Dateien kann es so aussehen:

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')

Aber was passiert, wenn es sich um eine serialisierte Zeichenfolge (JSON) in der Datenbanktabelle handelt? So sieht es aus wie { "image": "http:\/\/example.io\/wp-content\/uploads\/Another-Doc.pdf" }. Was muss ich zur REPLACE-Anweisung hinzufügen?

Die REPLACE-Anweisung kann jetzt in allen MySQL-Tabellen verwendet werden, die Bild-URLs enthalten. Ich dachte darüber nach, ein Filterarray zu erstellen, in dem Plugins ihre Tabellen hinzufügen können, und meine Erweiterung erledigt den Rest:

<?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")
    //...
));
?>

Das "Verschieben" -Protokoll

Ich möchte ein "Protokoll" erstellen, in dem Benutzer Verschiebungen rückgängig machen können. Wenn ein Benutzer sieht, dass ein Bild beschädigt ist (z. B. im Slider Revolution-Plugin), kann er das Verschieben in den ursprünglichen Ordner rückgängig machen.

Was denkst du über diese Idee? Gibt es eine bessere Lösung? Ich hoffe, ich habe alles auf eine nette Art erklärt!

21

Kostenlose Lösungserweiterung "Physical Custom Upload Folder"

Vor langer Zeit habe ich begonnen, diesen Thread zu öffnen, und jetzt gibt es ein verwendbares Erweiterungs-Plugin für die Real Media Library, mit dem Sie Ihren Upload-Ordner physisch verwalten .

 enter image description here 

Schauen Sie sich dieses Plugin an: https://wordpress.org/plugins/physical-custom-upload-folder/

Kennst du den Ordner wp-content/uploads? Dort werden die Dateien in Jahr/Monat-basierten Ordnern gespeichert. Dies kann ein sehr komplizierter und massenhafter Vorgang sein, insbesondere wenn Sie mit einem FTP-Client wie FileZilla arbeiten.

Verschieben bereits hochgeladener Dateien: Dieses Plugin erlaubt es nicht, die Dateien physisch zu verschieben, wenn Sie eine Datei in der Real Media Library verschieben, da WordPress die URLs an verschiedenen Stellen verwendet. Es ist sehr schwer, einen solchen Prozess aufrechtzuerhalten. Das funktioniert also nur für neue Uploads.

1