Abrufen der nächsten benannten Bildgröße aus einem Array mit Dimensionen

Ich möchte die nächst benannte Bildgröße (z. B. 'thumbnail' , 'medium' , 'large' , 'full' oder den Namen beliebiger mit add_image_size() hinzugefügter benutzerdefinierter Größen) aus einem Array von width / height-Werten (z array( 150, 150 ) ). Ich möchte im Wesentlichen tun, was wp_get_attachment_image und verwandte functionen tun, aber ohne ein tatsächliches Bild .

Ich hoffe auf etwas wie:

 $image_size = get_named_size( array( 150, 150 ) ); // returns 'thumbnail' $another_size = get_named_size( array( 999999, 999999 ) ); // returns 'full' 

Es sieht so aus, als ob alle Größenänderungsmagie in den Bildfunktionen in image_downsize() passiert, aber soweit ich das sehe, image_downsize() alles, was passiert, von einem tatsächlichen Bild ab und gibt nur ein neues Bild zurück, nicht eine Größe, die nicht wirklich hilft mich.

Ich kann alle vorhandenen Größen mit etwas wie die Beispiele hier bekommen , aber meine Array-Werte mit allen existierenden Größen zu vergleichen und die nächste zu finden wird etwas umständlich, also hoffte ich, dass es eine existierende wp-function gab, die mir helfen könnte .

Solutions Collecting From Web of "Abrufen der nächsten benannten Bildgröße aus einem Array mit Dimensionen"

Es stellte sich heraus, dass image_get_intermediate_size() einfach genug war, um sich an meine Bedürfnisse anzupassen. Anstatt wp_get_attachment_metadata zu verwenden, um die verfügbaren Größen eines vorhandenen Bildes zu erhalten, verwende ich meine eigene function, um alle verfügbaren Bildgrößen zu erhalten (im Wesentlichen die gleiche wie die hier vorgeschlagene function). Ich gebe dann einfach den Namen und nicht das Array von Metadaten zurück.

Es funktioniert, ich muss jedoch ein paar gründliche Tests durchführen und muss möglicherweise einige Änderungen vornehmen (nicht sicher, dass ich tatsächlich “thumbnail” für Größen kleiner als “thumbnail” zum Beispiel zurückgeben möchte) …

Hier ist meine gesamte function (es ist eine statische Methode einer Dienstprogrammklasse):

 /** * Return the closest named size from an array of width and height values. * * Based off of WordPress's image_get_intermediate_size() * If the size matches an existing size then it will be used. If there is no * direct match, then the nearest image size larger than the specified size * will be used. If nothing is found, then the function will return false. * Uses get_image_sizes() to get all available sizes. * * @param array|string $size Image size. Accepts an array of width and height (in that order). * @return false|string $data named image size eg 'thumbnail'. */ public static function get_named_size( $size ) { $image_sizes = self::get_image_sizes(); $data = array(); // Find the best match when '$size' is an array. if ( is_array( $size ) ) { $candidates = array(); foreach ( $image_sizes as $_size => $data ) { // If there's an exact match to an existing image size, short circuit. if ( $data['width'] == $size[0] && $data['height'] == $size[1] ) { $candidates[ $data['width'] * $data['height'] ] = array( $_size, $data ); break; } // If it's not an exact match, consider larger sizes with the same aspect ratio. if ( $data['width'] >= $size[0] && $data['height'] >= $size[1] ) { if ( wp_image_matches_ratio( $data['width'], $data['height'], $size[0], $size[1] ) ) { $candidates[ $data['width'] * $data['height'] ] = array( $_size, $data ); } } } if ( ! empty( $candidates ) ) { // Sort the array by size if we have more than one candidate. if ( 1 < count( $candidates ) ) { ksort( $candidates ); } $data = array_shift( $candidates ); $data = $data[0]; /* * When the size requested is smaller than the thumbnail dimensions, we * fall back to the thumbnail size to maintain backwards compatibility with * pre 4.6 versions of WordPress. */ } elseif ( ! empty( $image_sizes['thumbnail'] ) && $image_sizes['thumbnail']['width'] >= $size[0] && $image_sizes['thumbnail']['width'] >= $size[1] ) { $data = 'thumbnail'; } else { return false; } } elseif ( ! empty( $image_sizes[ $size ] ) ) { $data = $size; } // If we still don't have a match at this point, return false. if ( empty( $data ) ) { return false; } return $data; } 

Was ich (nahe genug) nutzen kann, wie ich ursprünglich wollte:

 $image_size = My_Utility_Class::get_named_size( array( 150, 150 ) ); // returns 'thumbnail'