web-dev-qa-db-fra.com

Obtenez une liste de toutes les tailles d'image qui correspondent au format de l'image d'origine

J'ai besoin des mêmes fonctionnalités que la méthode WordPress wp_calculate_image_srcset() par défaut qui renvoie la chaîne pour srcset:

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

mais il devrait retourner un tableau au lieu de string, avec une structure similaire à:

$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
  )
);

Je comprends que je peux simplement analyser la chaîne elle-même, mais je me demande si c'est sûr? Le plugin que je crée est public et peut être utilisé sur n’importe quel serveur doté d’autres plugins susceptibles de modifier cette chaîne.

La source de wp_calculate_image_srcset semble compliquée et utilise quelques méthodes "_private".

Le wp_calculate_image_srcset utilise également le filtre max_srcset_image_width (qui limite la taille maximale de l'image) et je dois l'éviter d'une manière ou d'une autre. Remove_filter -> execute method -> add_filter est-il le seul moyen de l'ignorer?

Edit: J'ai fini par le faire (si c'est une mauvaise idée - merci de me le faire savoir):

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

Je pense que vous devriez utiliser wp_calculate_image_srcset() pour la simple raison que c'est très complexe (cela n'aurait pas dû être une fonction au départ). La dupliquer pourrait entraîner des effets secondaires étranges à l'avenir lorsque WP modifierait l'algorithme d'origine.

Pour les problèmes de filtre:

Vous pouvez passer un troisième paramètre dans $size_array. WP ne cherchera que les deux premières valeurs. Si vous appelez la fonction comme ça…

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

… Vous pouvez rechercher cette valeur lorsque vous filtrez max_srcset_image_width.

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);

Oui, c'est un bidouillage. Mais cela fonctionnera jusqu'à ce que WP utilise une troisième entrée de tableau ici. Gardez un œil sur la source WP. :)

Et puis je filtrerais wp_calculate_image_srcset (avec une priorité de - PHP_INT_MAX pour pouvoir courir en premier) et récupérerais les sources. C'est un tableau et probablement légèrement plus facile à analyser que la chaîne que la fonction renvoie.

Note latérale: Veuillez ne pas enregistrer de callback pour les hooks dans un constructeur . :)

3
fuxia