web-dev-qa-db-fra.com

wp_get_attachment_image_src et chemin du serveur

wp_get_attachment_image_src me donnera l'URL et les dimensions d'une image.

Mais existe-t-il un moyen d’obtenir le chemin du serveur pour une image redimensionnée (comme /html/wordpress/wp-content/uploads/2015/03/cat-2-300x225.jpeg)? Je sais à propos de get_attached_file mais cela ne renvoie que l'image d'origine.

Je voudrais éviter les solutions de hacky (domaines de remplacement de chaîne, etc.) ou utiliser directement WP_Image_Editor. En outre, il devrait être multi-sites. Y a-t-il quelque chose d'officiel que je viens de manquer?

6
maryisdead

WordPress ne stocke pas le chemin des tailles générées, vous devez le construire le.

Comme suggéré par @kraftner dans les commentaires, wp_get_attachment_metadata() peut être utilisé pour obtenir certains des éléments nécessaires à la construction du chemin. Une alternative est image_get_intermediate_size() .

Le pièce manquante} est le chemin absolu du dossier de téléchargement. En théorie, qui peut être récupéré via wp_upload_dir() mais il y a un problème: cette fonction renvoie le dossier de téléchargement au moment où il est appelé, mais il est toujours possible que le fichier soit chargé. chemin était différent.

Ainsi, la possibilité seulement consiste à supposer que l’image mise à l’échelle se trouve dans le même dossier que l’image originale.

Cette hypothèse peut sembler bidon, et probablement, mais elle est utilisée dans WordPress même par des fonctions telles que image_downsize () qui fait exactement remplacement de chaîne} _ (voir ligne # 184 sur media.php ), donc si vous cherchez le voie officielle .. c'est celui-là.

Mettre les choses ensemble:

function scaled_image_path($attachment_id, $size = 'thumbnail') {
    $file = get_attached_file($attachment_id, true);
    if (empty($size) || $size === 'full') {
        // for the original size get_attached_file is fine
        return realpath($file);
    }
    if (! wp_attachment_is_image($attachment_id) ) {
        return false; // the id is not referring to a media
    }
    $info = image_get_intermediate_size($attachment_id, $size);
    if (!is_array($info) || ! isset($info['file'])) {
        return false; // probably a bad size argument
    }

    return realpath(str_replace(wp_basename($file), $info['file'], $file));
}

La fonction ci-dessus prend l'identifiant de la pièce jointe, une taille et renvoie le chemin.

J'ai déjà appliqué realpath before pour renvoyer les chemins car cette fonction renvoie false pour les fichiers inexistants. Par conséquent, la fonction entière renvoie toujours false en cas de problème.

La seule alternative à ce flux serait de sauver par vous-même le chemin des images redimensionnées quelque part, probablement après méta, et de récupérer si nécessaire, mais cela ne peut fonctionner que pour les fichiers téléchargés après l'activation de votre plugin ...

10
gmazzap