Philipp, tout est possible si vous y pensez. Vous pouvez résoudre votre problème en étendant la classe de l'éditeur d'images WordPress.
Remarque J'utilise WordPress 3.7 - Je n'ai vérifié aucun du code ci-dessous dans les versions antérieures et dans la dernière version 3.8.
Notions de base sur l'éditeur d'images
WordPress a deux classes intégrées qui gèrent la manipulation d'images:
WP_Image_Editor_GD
( /wp-includes/class-wp-image-editor-gd.php
)
WP_Image_Editor_Imagick
( /wp-includes/class-wp-image-editor-imagick.php
)
Ces deux classes s'étendent WP_Image_Editor
car elles utilisent toutes deux un moteur d'image différent (respectivement GD et ImageMagick) pour charger, redimensionner, compresser et enregistrer des images.
Par défaut, WordPress essaiera d'abord d'utiliser le moteur ImageMagick, qui nécessite une extension PHP, car il est généralement préféré au moteur GD par défaut de PHP. La plupart des serveurs partagés n'ont pas l'extension ImageMagick activée.
Ajouter un éditeur d'images
Pour décider quel moteur utiliser, WordPress appelle une fonction interne __wp_image_editor_choose()
(située dans /wp-includes/media.php
). Cette fonction parcourt tous les moteurs pour voir quel moteur peut traiter la demande.
La fonction a également un filtre appelé wp_image_editors
qui vous permet d'ajouter plus d'éditeurs d'images comme ceci:
add_filter("wp_image_editors", "my_wp_image_editors");
function my_wp_image_editors($editors) {
array_unshift($editors, "WP_Image_Editor_Custom");
return $editors;
}
Notez que nous ajoutons notre classe d'édition d'image personnalisée WP_Image_Editor_Custom
afin que WordPress vérifie si notre moteur peut gérer le redimensionnement avant de tester d'autres moteurs.
Création de notre éditeur d'images
Maintenant, nous allons écrire notre propre éditeur d'images afin que nous puissions décider nous-mêmes des noms de fichiers. Le nom de fichier est géré par la méthode WP_Image_Editor::generate_filename()
(les deux moteurs héritent de cette méthode), nous devons donc remplacer cela dans notre classe personnalisée.
Comme nous ne prévoyons que de changer les noms de fichiers, nous devons étendre l'un des moteurs existants afin de ne pas avoir à réinventer la roue. Je vais développer WP_Image_Editor_GD
dans mon exemple, car vous n'avez probablement pas l'extension ImageMagick activée. Le code est cependant interchangeable pour une configuration ImageMagick. Vous pouvez ajouter les deux si vous prévoyez d'utiliser le thème sur différentes configurations.
// Include the existing classes first in order to extend them.
require_once ABSPATH.WPINC."/class-wp-image-editor.php";
require_once ABSPATH.WPINC."/class-wp-image-editor-gd.php";
class WP_Image_Editor_Custom extends WP_Image_Editor_GD {
public function generate_filename($prefix = NULL, $dest_path = NULL, $extension = NULL) {
// If empty, generate a prefix with the parent method get_suffix().
if(!$prefix)
$prefix = $this->get_suffix();
// Determine extension and directory based on file path.
$info = pathinfo($this->file);
$dir = $info['dirname'];
$ext = $info['extension'];
// Determine image name.
$name = wp_basename($this->file, ".$ext");
// Allow extension to be changed via method argument.
$new_ext = strtolower($extension ? $extension : $ext);
// Default to $_dest_path if method argument is not set or invalid.
if(!is_null($dest_path) && $_dest_path = realpath($dest_path))
$dir = $_dest_path;
// Return our new prefixed filename.
return trailingslashit($dir)."{$prefix}/{$name}.{$new_ext}";
}
}
La plupart du code ci-dessus a été directement copié de la WP_Image_Editor
classe et commenté pour votre commodité. Le seul changement réel est que le suffixe est maintenant un préfixe.
Alternativement, vous pouvez simplement appeler parent::generate_filename()
et utiliser un mb_str_replace()
pour changer le suffixe en préfixe, mais j'ai pensé que ce serait plus enclin à mal tourner.
Enregistrement de nouveaux chemins d'accès aux métadonnées
Après le téléchargement image.jpg
, le dossier des téléchargements ressemble à ceci:
2013/12/150x150/image.jpg
2013/12/300x300/image.jpg
2013/12/image.jpg
Jusqu'ici tout va bien. Cependant, lorsque vous appelez des fonctions de base comme wp_get_attachment_image_src()
, nous remarquerons que toutes les tailles d'image sont stockées comme image.jpg
sans le nouveau chemin de répertoire.
Nous pouvons contourner ce problème en enregistrant la nouvelle structure de dossiers dans les métadonnées d'image (où les noms de fichiers sont stockés). Les données à travers différents filtres court ( wp_generate_attachment_metadata
entre autres) avant d' être insérés dans la base de données, mais étant donné que nous mettons en œuvre déjà un éditeur d'image personnalisée, nous pouvons voyager à la source de métadonnées de taille de l' image: WP_Image_Editor::multi_resize()
. Il génère des tableaux comme celui-ci:
Array (
[thumbnail] => Array (
[file] => image.jpg
[width] => 150
[height] => 150
[mime-type] => image/jpeg
)
[medium] => Array (
[file] => image.jpg
[width] => 300
[height] => 300
[mime-type] => image/jpeg
)
)
Nous remplacerons la multi_resize()
méthode dans notre classe personnalisée:
function multi_resize($sizes) {
$sizes = parent::multi_resize($sizes);
foreach($sizes as $slug => $data)
$sizes[$slug]['file'] = $data['width']."x".$data['height']."/".$data['file'];
return $sizes;
}
Comme vous pouvez le voir, je n'ai pas pris la peine de remplacer le code. J'appelle simplement la méthode parent et je la laisse générer les métadonnées. Ensuite, je passe en revue le tableau résultant et ajuste la file
valeur pour chaque taille.
wp_get_attachment_image_src($att_id, array(300, 300))
Retourne maintenant 2013/12/300x300/image.jpg
. Hourra!
Dernières pensées
J'espère que cela vous a fourni une bonne base pour développer. Cependant, veuillez noter que si une image est plus petite que la taille spécifiée (par exemple 280x300), le suffixe généré (préfixe dans notre cas) et les tailles d'image sont 280x300, pas 300x300. Si vous téléchargez un grand nombre d'images plus petites, vous obtiendrez de nombreux dossiers différents.
Une bonne solution serait d'utiliser soit la limace de taille comme un nom de dossier ( small
, medium
, etc.) ou d' étendre le code à des tailles rondes jusqu'à la taille d'image préférée le plus proche.
Vous avez noté que vous souhaitez utiliser uniquement la largeur comme nom de répertoire. Soyez averti cependant - les plugins ou les thèmes peuvent générer deux tailles différentes avec la même largeur mais des hauteurs différentes.
De plus, vous pouvez supprimer les dossiers année / mois en désactivant «Organiser mes téléchargements dans des dossiers mensuels et annuels» sous Paramètres> Média ou en manipulant generate_filename
encore plus.
J'espère que cela t'aides. Bonne chance!
@ La réponse de Robbert était une ressource divine dans mes efforts pour stocker des tailles alternatives générées par WordPress dans des répertoires séparés. Mon code change également le répertoire de téléchargement en ./media alors assurez-vous de modifier ces lignes si vous ne le souhaitez pas. Ce n'est pas une réponse exacte à la question de la première affiche, mais offre une solution alternative au même problème:
Fonctionne sans aucun problème selon mes tests, même si je n'ai pas essayé de vérifier comment cela se passe avec les plugins galerie / média populaires.
bonus connexe: un utilitaire brut pour supprimer toutes les vignettes générées par WordPress delete_deprecated_thumbs.php
la source
J'ai regardé ces parties du code WordPress et je crains de ne pas avoir de bonnes nouvelles.
Il y a 2 classes:
WP_Image_Editor_GD
WP_Image_Editor_Imagick
,les deux étendent la
WP_Image_Editor
classe abstraite .Ces classes implémentent une
multi_resize
méthode, qui est utilisée pour générer plusieurs images à partir d'une téléchargée.La très mauvaise nouvelle est qu'il n'y a aucun crochet de filtre là-dedans, que nous pourrions utiliser pour modifier le chemin de destination des fichiers nouvellement créés.
la source
noscript
balise manuellement )<img src="http://placehold.it/260" data-src="http://placehold.it/{width}" />
. Et puis le script vérifie la taille de l'img et charge la meilleure taille d'image pour cela.Ok, je pense que je l'ai! Pas parfait mais correct pour cela, je le voulais. Pour moi, seule la largeur d'une image est importante. La hauteur est inutile pour moi. Surtout pour implémenter Imager.js, la hauteur dans l'url de l'image est dérangeante.
Avec ce code, les noms de fichiers sont comme:
Il n'est pas possible d'ajouter un sous-dossier aux noms de fichiers, car si j'ajoute des images dans une publication / page, la source d'origine sera toujours utilisée à la place. Et la suppression de ces images lors de la suppression ne fonctionnera pas non plus. Je ne sais pas pourquoi.
la source