Einführung.
Im obigen Screenshot sehen Sie eine Ordnerstruktur, die mit dem Premium-Plugin Real Media Library erstellt wurde . Jetzt möchte ich ein Erweiterungs-Plugin erstellen, das die Ordnerstruktur in eine physische Ordnerstruktur gliedern kann - RML ist nur eine visuelle Struktur.
Update Nr. 2 (2017-01-27): Überprüfen Sie die Antwort!
Schauen Sie sich die physische Organisation der WordPress-Medienbibliothek (Real Media Library-Plugin) an, in der ich ein kostenloses Erweiterungs-Plugin erstellt habe.
Update Nr. 1 (14.12.2016): Erster Erfolg: Benutzerdefinierter Ordner zum Hochladen von Miniaturansichten
Jetzt habe ich ein weiteres Plugin für den Real Thumbnail Generator erstellt , mit dem Sie einen benutzerdefinierten Ordner zum Hochladen von Thumbnails erstellen können. Schauen Sie sich einfach diesen Screenshot an:
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:
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 WP-Funktion wp_mkdir_p () . Die GUID in der Tabelle wp_posts 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:
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 mit den physischen Ordnern auf dem neuesten Stand sind ? 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 { "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 schön erklärt!