wp_get_attachment_image_src și calea pe server

27 mar. 2015, 15:33:15
Vizualizări: 13.9K
Voturi: 6

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?

5
Comentarii

Acesta pare să fie un duplicat, dar are deficiențele menționate de tine. Postez doar pentru completitudine. :)

kraftner kraftner
27 mar. 2015 16:03:32

Da. Dar aceasta returnează doar ceva de genul 2015/03/cat-2.jpeg. Deși returnează și toate numele de fișiere pentru miniaturile generate, dar doar numele de fișiere – iar asta duce din nou la manipularea greoaie a căilor.

maryisdead maryisdead
27 mar. 2015 16:35:31

Știu, dar cred că asta e cel mai apropiat lucru pe care îl poți obține. Pot să te întreb și pentru ce ai nevoie de asta?

kraftner kraftner
27 mar. 2015 16:42:25

Lucrez la un plugin pentru a integra imaginea postului ca un RSS enclosure în feed-urile generate de WordPress și de aceea am nevoie să știu dimensiunea fișierului (și tipul MIME).

maryisdead maryisdead
27 mar. 2015 17:03:17
Toate răspunsurile la întrebare 1
2
17

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...

28 mar. 2015 01:30:32
Comentarii

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!

maryisdead maryisdead
30 mar. 2015 23:04:28

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.

Tim Malone Tim Malone
16 aug. 2016 08:49:43