Organisation physique de la médiathèque wordpress (plugin Real Media Library)

22

Structure de dossiers de la Real Media Library

Introduction.

Dans la capture d'écran ci-dessus, vous pouvez voir une structure de dossiers construite avec le plugin premium Real Media Library . Maintenant, je veux créer un plugin d'extension qui peut organiser la structure de dossiers en structure de dossiers physiques - RML n'est qu'une structure visuelle.

Mise à jour # 2 (2017-01-27): Découvrez la réponse!

Jetez un œil à l' organisation physique de la médiathèque wordpress (plugin Real Media Library) où j'ai créé un plugin d'extension gratuit.

Mise à jour # 1 (2016-12-14): Le premier succès: dossier de téléchargement de vignettes personnalisées

Maintenant, j'ai créé un autre plugin Real Thumbnail Generator , qui vous permet de créer un dossier de téléchargement de vignettes personnalisé. Jetez un œil à cette capture d'écran:

Dossier de téléchargement du générateur de miniatures réelles

Pourquoi des dossiers de vignettes personnalisées? Les dossiers de miniatures personnalisées sont plus faciles à gérer, car ici, nous n'avons pas besoin de maintenir les URL de mise à jour de la base de données car les miniatures sont toujours au même emplacement (qui n'est toujours pas modifié par l'extension RML).

Si vous souhaitez en savoir plus sur le générateur de vignettes personnalisées, vous pouvez consulter ce fil de discussion, où j'ai expliqué une approche technique Chaque taille d'image personnalisée dans le répertoire de téléchargement personnalisé? .

Merci de garder ce fil, car début 2017 je vais continuer le développement de l'extension RML qui permet la synchronisation entre RML et le dossier uploads du serveur. L'extension est également compatible avec le plugin Real Thumbnail Generator, donc il devrait y avoir la mise à jour de la base de données.

Message d'origine

Mon objectif d'extension.

Pour le moment, je suis dans le dossier "/ Unorganized", cela signifie que c'est le dossier / wp-content / uploads /. Lorsque je déplace le fichier (comme vous pouvez le voir sur la capture d'écran) dans le dossier PDFs / SubDir, le fichier se trouve dans le dossier visuel. Maintenant, mon extension détecte le dossier différent du dossier physique et affiche un petit "bouton" qui permet à l'utilisateur de le déplacer physiquement aussi:

Bouton pour le physix

L'utilisateur clique maintenant sur le bouton "Physix it!" et le fichier doit être déplacé vers /wp-content/uploads/pdfs/subdir/Another-Doc.pdf . J'ai déjà créé le processus de déplacement: j'ai lu tous les fichiers multimédias pour cette pièce jointe (vignettes incluses pour les images) et j'utilise la fonction php renommer ($ old_file, $ new_file) avec la fonction WP wp_mkdir_p () . Le GUID dans la table wp_posts et les métadonnées dans wp_postmeta sont également modifiés. Lorsque tous les fichiers sont déplacés, j'appelle l'action:

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

$ meta est un tableau:

entrez la description de l'image ici

La clé "renommer" contient tous les processus de changement de nom (par exemple ici les fichiers de vignettes pour les images).

Le problème: garantir la compatibilité des plugins.

Le principal problème (le cas échéant) de la bibliothèque multimédia WordPress est que de nombreux plugins enregistrent les références aux images avec des URL complètes au lieu de l'ID de pièce jointe. Cela signifie qu'il existe des tables MySQL avec des colonnes qui contiennent une URL vers le fichier donné. Comment puis-je garantir que TOUTES les références sont à jour avec les dossiers physiques? Je pense que c'est impossible.

Une approche possible.

Je me connecte à l'action et met à jour les tables standard comme wp_post-> post_content , ... avec une instruction REPLACE récursive en 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
}
?>

La variable $ rec est maintenant une instruction REPLACE:

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

Au fait: pour une image (testimage.jpg) avec tous les fichiers miniatures, elle peut ressembler à ceci:

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

Mais que se passe-t-il, s'il s'agit d'une chaîne sérialisée (JSON) dans la table de base de données? Donc ça ressemble { "image": "http:\/\/example.io\/wp-content\/uploads\/Another-Doc.pdf" }. Que dois-je ajouter à la déclaration REPLACE?

L'instruction REPLACE peut désormais être utilisée dans toutes les tables MySQL qui contiennent des URL d'images. J'ai pensé à créer un tableau de filtres où les plugins peuvent ajouter leurs tables et mon extension fait le reste:

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

Le journal "move"

Je veux créer un "journal" où les utilisateurs peuvent annuler les mouvements. Si un utilisateur voit, une image est cassée (par exemple dans le plugin Slider Revolution), il peut annuler le déplacement vers le dossier d'origine.

Que pensez-vous de cette idée? Y a-t-il une meilleure solution? J'espère que j'ai expliqué tout d'une manière agréable!

Matthias Günter
la source
9
Vous n'êtes pas censé voir la structure des dossiers sous-jacents aux pièces jointes, dans de nombreux cas, il n'y en a pas (peut-être que les fichiers ne sont même pas sur le serveur? S3 AWS CDN, etc.), WordPress traite les articles joints, pas les fichiers joints, et les déplacer sur un serveur est contre-productif. Vous feriez mieux de le faire avec une taxonomie personnalisée et des règles de réécriture qui déclenchent une redirection
Tom J Nowell
5
Bien que ce soit une excellente question en termes de clarté / qualité (+1 pour l'effort), nous avons finalement affaire à un plugin tiers ici, qui est considéré comme hors sujet - je ne pense pas que quiconque puisse vous aider "rapidement" sans vous investir sérieusement dans RML.
TheDeadMedic
@TheDeadMedic Oui, c'est vrai. Mais j'ai posé la question de la manière, que vous savez comment cela fonctionne avec les actions dans RML. Cette question n'est pas spécifique à RML, elle est plus spécifique à la base de données - comment résoudre le problème avec le remplacement d'URL.
Matthias Günter
2
Et un autre +1 pour l'effort - j'aurais aimé avoir plus de ces questions… comme nous l'avions fait au début. Quoi qu'il en soit, les principaux problèmes sont décrits ci-dessus. Pour faire valoir votre point de vue: pourriez-vous déposer une modification et expliquer le raisonnement de ce que vous essayez? Jusqu'à présent, cela n'a aucun sens d'effectuer ces tâches de système de fichiers.
kaiser
Comment en êtes-vous arrivé à ce @ MatthiasGünter? Avez-vous réussi à trouver une solution?
Tim Malone

Réponses:

1

Extension de solution gratuite "Dossier de téléchargement personnalisé physique"

Il y a longtemps, j'ai commencé à ouvrir ce fil et maintenant il existe un plugin d'extension utilisable pour Real Media Library qui vous permet de gérer physiquement votre dossier de téléchargements .

entrez la description de l'image ici

Découvrez ce plugin: https://wordpress.org/plugins/physical-custom-upload-folder/

Connaissez-vous le dossier wp-content / uploads? Là, les fichiers sont stockés dans des dossiers basés sur l'année / le mois. Cela peut être un processus de masse très compliqué, surtout lorsque vous travaillez avec un client FTP comme FileZilla.

Déplacer des fichiers déjà téléchargés: ce plugin ne permet pas de déplacer physiquement les fichiers lorsque vous déplacez un fichier dans la Real Media Library car WordPress utilise les URL à différents endroits. Il est très difficile de maintenir un tel processus. Cela ne fonctionne donc que pour les nouveaux téléchargements.

Matthias Günter
la source