wake-up-neo.com

Eine Liste aller Bildgrößen abrufen, die dem Seitenverhältnis des Originals entsprechen

Ich benötige die gleiche Funktionalität wie die Standardmethode WordPress wp_calculate_image_srcset(), die den String für srcset zurückgibt:

image-300x200.jpg 300w, image-600x400.jpg 600w, ...

es sollte jedoch ein Array anstelle eines Strings mit einer Struktur ähnlich der folgenden zurückgeben:

$image_sizes = array(
  array(
    'url' => 'image-300x200.jpg',
    'width' => 300,
    'height' => 200
  ),
  array(
    'url' => 'image-600x400.jpg',
    'width' => 600,
    'height' => 400
  ),
  array(
    'url' => 'image.jpg',
    'width' => 1200,
    'height' => 800
  )
);

Ich verstehe, dass ich nur die Zeichenfolge selbst analysieren kann, aber ich frage mich, ob es sicher ist? Das Plugin, das ich mache, ist öffentlich und kann auf jedem Server mit anderen Plugins verwendet werden, die diese Zeichenfolge ändern könnten.

Quelle von wp_calculate_image_srcset scheint kompliziert und verwendet ein paar "_private" Methoden.

Der wp_calculate_image_srcset verwendet auch den max_srcset_image_width-Filter (der die maximale Bildgröße begrenzt) und ich muss ihn irgendwie vermeiden. Ist remove_filter -> execute method -> add_filter die einzige Möglichkeit, dies zu überspringen?

Edit: Am Ende habe ich das getan (wenn es eine schlechte Idee ist - lass es mich wissen):

class MyClass {
    public $image_items;

    function __construct() {
        add_filter('wp_calculate_image_srcset', array($this, 'filter_my_srcset'), 10, 5);
        wp_calculate_image_srcset( ... );
        remove_filter('wp_calculate_image_srcset', array($this, 'filter_my_srcset'));

        // print_r( $this->image_items );
    }

    public function filter_my_srcset( $source, ... ) {
        $this->image_items = $source;
        return $source;
    }
}
1
Marvin3

Ich denke, Sie sollten wp_calculate_image_srcset() verwenden, aus dem einfachen Grund, dass es sehr komplex ist (es sollte nicht nur eine Funktion gewesen sein). Das Duplizieren kann in Zukunft zu seltsamen Nebenwirkungen führen, wenn WP den ursprünglichen Algorithmus ändert.

Für die Filterprobleme:

Sie können einen dritten Parameter in $size_array übergeben. WP untersucht nur die ersten beiden Werte. Wenn Sie die Funktion so aufrufen ...

wp_calculate_image_srcset( [600, 400, 'wpse_281968'], … )

… Können Sie nach diesem Wert suchen, wenn Sie max_srcset_image_width filtern.

add_filter( 'max_srcset_image_width', function( $max, array $sizes ) {

    if ( ! empty ( $sizes[2] ) && 'wpse_281968' === $sizes[2] )
        return PHP_INT_MAX;

    return $max;

}, 10, 20);

Ja, es ist ein Hack. Aber es wird funktionieren, bis WP hier einen dritten Array-Eintrag verwendet. Behalten Sie die Quelle WP im Auge. :)

Und dann würde ich wp_calculate_image_srcset filtern (mit der Priorität - PHP_INT_MAX, um zuerst ausgeführt zu werden) und die Quellen daraus abrufen. Es ist ein Array und wahrscheinlich etwas einfacher zu analysieren als der String, den die Funktion zurückgibt.

Randnotiz: Bitte registrieren Sie keine Rückrufe für Hooks in einem Konstruktor . :)

3
fuxia