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

22

Ordnerstruktur der Real Media Library

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:

Real Thumbnail Generator Ordner hochladen

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:

Knopf um es zu physixieren

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:

Bildbeschreibung hier eingeben

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!

Matthias Günter
quelle
9
Es ist nicht beabsichtigt, die Ordnerstruktur zu sehen, die den Anhängen zugrunde liegt. In vielen Fällen gibt es keine (möglicherweise befinden sich die Dateien nicht einmal auf dem Server? S3 AWS CDN usw.). WordPress handelt mit Anhangs-Posts, nicht mit Anhangsdateien und Das Verschieben auf einem Server ist kontraproduktiv.
Tom J Nowell
5
Obwohl dies eine ausgezeichnete Frage in Bezug auf Klarheit / Qualität ist (+1 für Aufwand), handelt es sich hier letztendlich um ein Plugin von Drittanbietern, das als nicht thematisch eingestuft wird. Ich glaube nicht, dass irgendjemand dazu in der Lage sein wird "schnell" helfen, ohne ernsthaft in RML zu investieren.
TheDeadMedic
@TheDeadMedic Ja das ist wahr. Aber ich habe die Frage übrigens gestellt, dass Sie wissen, wie es mit den Aktionen in RML funktioniert. Diese Frage ist nicht RML-spezifisch, sondern eher datenbankspezifisch. Hier erfahren Sie, wie Sie das Problem mit der URL-Ersetzung lösen können.
Matthias Günter
2
Und noch ein +1 für Mühe - wünschte, wir hätten mehr solcher Fragen ... wie in den frühen Tagen. Wie auch immer, die Hauptprobleme sind oben umrissen. Um es auf den Punkt zu bringen: Könnten Sie bitte eine Bearbeitung einreichen und die Gründe für den Versuch erläutern ? Bisher macht es keinen Sinn, diese Dateisystem-Tasks auszuführen.
Kaiser
Wie bist du mit diesem @ MatthiasGünter gelaufen? Haben Sie es geschafft, eine Lösung zu finden?
Tim Malone

Antworten:

1

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 können .

Bildbeschreibung hier eingeben

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

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

Verschieben bereits hochgeladener Dateien: Dieses Plugin erlaubt es nicht, 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.

Matthias Günter
quelle