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!