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:
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:
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:
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!