web-dev-qa-db-fra.com

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

 Real Media Library folder structure 

Introduction.

Dans la capture d'écran ci-dessus, vous pouvez voir une structure de dossiers construite avec le plugin premiumReal Media Library. Maintenant, je veux créer un plug-in d'extension capable d'organiser la structure de dossiers en structure de dossiers physique - RML n'est qu'une structure visuelle.

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

Regardez Organisation physique de la médiathèque wordpress (plugin Real Media Library) où j'ai créé un plugin d'extension gratuit.

Mise à jour n ° 1 (2016-12-14): Premier succès: dossier de téléchargement de miniatures personnalisé

Maintenant, j'ai créé un autre pluginReal Thumbnail Generator, qui vous permet de créer un dossier de téléchargement de vignettes personnalisé. Il suffit de regarder cette capture d'écran:

 Real Thumbnail Generator Upload folder 

Pourquoi des dossiers de miniatures personnalisés? Les dossiers de vignettes personnalisés sont plus faciles à gérer car ici, il n’est pas nécessaire de conserver les URL de mise à jour de la base de données car les vignettes se trouvent toujours au même emplacement (qui n’a toujours pas été modifié par l’extension RML).

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

Veuillez rester sur ce fil, car début 2017, je poursuivrai le développement de l'extension RML qui permet la synchronisation entre RML et le dossier de téléchargement du serveur. L'extension est également compatible avec le plugin Real Thumbnail Generator, il devrait donc y avoir une mise à jour de la base de données.

Original post

Mon objectif d'extension.

Au moment où 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 Visual. 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:

 Button to physix it 

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: je lis tous les fichiers multimédias de cette pièce jointe (miniatures incluses pour les images) et utilise la fonction php renommer ($ ancien_fichier, $ nouveau_fichier) avec WPfonction wp_mkdir_p () . Le GUID de la table wp_posts et les métadonnées de wp_postmeta sont également modifiés. Quand 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:

 enter image description here 

La clé "renommer" contient tous les processus de changement de nom (par exemple, il peut s'agir des fichiers de vignettes pour les images).

Le problème: garantir la compatibilité du plugin.

Le principal problème (le cas échéant) de la médiathèque WordPress est que de nombreux plug-in 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 contenant une URL vers le fichier donné. Comment puis-je garantir que TOUT les références sont à jour avec les dossiers physiques? Je pense que c'est impossible.

Une approche possible.

J'accroche à 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, cela 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, cela ressemble à { "image": "http:\/\/example.io\/wp-content\/uploads\/Another-Doc.pdf" }. Que dois-je ajouter à la déclaration de remplacement?

L'instruction REPLACE peut maintenant être utilisée dans toutes les tables MySQL contenant des URL d'image. J'ai pensé créer un tableau de filtres où les plugins peuvent ajouter leurs tables et mon extension faire 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 des déplacements. Si un utilisateur le voit, une image est cassée (par exemple dans le plug-in Slider Revolution), il peut annuler le déplacement dans le dossier d'origine.

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

21
Matthias Günter

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

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

 enter image description here 

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 année/mois. Cela peut être un processus très compliqué et de masse, en particulier 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 médiathèque Real Media car WordPress utilise les URL à des endroits différents. Il est très difficile de maintenir un tel processus. Donc, cela ne fonctionne que pour les nouveaux téléchargements.

1
Matthias Günter