wp_get_attachment_image_src și calea pe server
wp_get_attachment_image_src
îmi oferă URL-ul și dimensiunile pentru o imagine.
Dar există vreo modalitate de a obține calea pe server pentru o imagine redimensionată (cum ar fi /html/wordpress/wp-content/uploads/2015/03/cat-2-300x225.jpeg
)? Cunosc despre get_attached_file
dar aceasta returnează doar imaginea originală.
Aș dori să evit soluții improvizate (înlocuirea string-urilor de domenii și altele asemenea) sau utilizarea directă a WP_Image_Editor
. De asemenea, soluția ar trebui să funcționeze și pe multisite. Există vreo metodă oficială pe care am omis-o?

WordPress nu stochează nicăieri calea către dimensiunile generate ale imaginilor, trebuie să o construiești manual.
După cum a sugerat @kraftner în comentarii, wp_get_attachment_metadata()
poate fi utilizat pentru a obține unele dintre informațiile necesare pentru a construi calea. O alternativă este image_get_intermediate_size()
.
Piesa lipsă este calea absolută către folderul de încărcare. În teorie, aceasta poate fi obținută prin wp_upload_dir()
, dar există o problemă: această funcție returnează folderul de încărcare în momentul în care este apelată, însă există întotdeauna posibilitatea ca atunci când fișierul a fost încărcat, calea să fi fost diferită.
Astfel, singura posibilitate este să presupunem că imaginea redimensionată se află în același folder cu imaginea originală.
Această presupunere poate părea improvizată și probabil că este, dar este folosită chiar în nucleul WordPress de funcții precum image_downsize(), care face exact înlocuirea de șiruri (vezi linia #184 din media.php
), așadar dacă cauți metoda oficială... aceasta este.
Punând totul laolaltă:
function scaled_image_path($attachment_id, $size = 'thumbnail') {
$file = get_attached_file($attachment_id, true);
if (empty($size) || $size === 'full') {
// pentru dimensiunea originală, get_attached_file este suficient
return realpath($file);
}
if (! wp_attachment_is_image($attachment_id) ) {
return false; // ID-ul nu se referă la un fișier media
}
$info = image_get_intermediate_size($attachment_id, $size);
if (!is_array($info) || ! isset($info['file'])) {
return false; // probabil un argument de dimensiune incorect
}
return realpath(str_replace(wp_basename($file), $info['file'], $file));
}
Funcția de mai sus primește ID-ul atașamentului și o dimensiune și returnează calea.
Am aplicat realpath
înainte de a returna căile, deoarece această funcție returnează false pentru fișierele care nu există, astfel încât întreaga funcție va returna mereu false dacă ceva nu a funcționat corect.
Singura alternativă la acest flux ar fi să salvezi manual calea către imaginea redimensionată undeva, probabil în meta datele postării, și să o obții când este necesar, dar acest lucru poate funcționa doar pentru fișierele încărcate după ce plugin-ul tău a fost activat...

Am parcurs drumul pe care l-ai ales, am scormonit prin codul de generare a imaginilor (în final presupunând că imaginea redimensionată se află în același folder cu originalul) și nu mi-a plăcut. Ei bine, presupun că trebuie să mă retrag atunci. Mulțumesc pentru răspunsul detaliat, domnule!

Mulțumesc pentru acest material! O scurtă post scriptum, pentru a include suportul pentru returnarea căii fișierelor SVG, deoarece nu există dimensiuni relevante de luat în considerare, poți adăuga ceva de genul || strtolower(pathinfo($file, PATHINFO_EXTENSION)) == "svg"
la prima instrucțiune if
.
