web-dev-qa-db-fra.com

Changer la taille des vignettes de shortcode de playlist?

J'utilise do_shortcode() pour afficher une liste de lecture audio WordPress personnalisée. Par défaut, la liste de lecture charge les jaquettes de chaque fichier audio (l'image sélectionnée de la pièce jointe) et change en fonction de la piste en cours de lecture. Le problème est que, par défaut, il charge la vignette de 150 x 150 pixels, mais j'aimerais charger une taille plus grande. Il ne semble pas y avoir une simple option pour changer la taille. Voici le code avec lequel je travaille:

do_shortcode( '[playlist ids="100, 101, 102, 103, 104, 105, 106"][/playlist]' );

J'ai essayé de changer la taille de la vignette dans function.php en utilisant set_post_thumbnail_size() et de lancer Regenerate Thumbnails, mais rien n'a changé.

J'ai également effectué une recherche dans le noyau de WordPress et constaté que la fonction qui contrôle le shortcode de la liste de lecture s'appelle wp_playlist_shortcode(). Il y a un peu de code qui définit la taille de la vignette. Je l'ai édité juste pour voir ce qui s'est passé, et c'est la seule chose qui a fonctionné jusqu'à présent. De toute évidence, ce n’est pas la voie à suivre, mais c’est là que je suis actuellement coincé. Je ne sais pas si je devrais laisser tomber cela ici aussi, j'apprécierais tout renseignement et toute aide que je pourrais obtenir.

2
charlenemasters

Plugin de démonstration - Taille fixe

Voici une suggestion sous forme de plug-in de démonstration (PHP 5.4+):

<?php
/* Plugin Name: Custom Playlist Thumb Size */

namespace WPSE238646\PlaylistThumbSize;

add_shortcode( 'playlist', function( $atts = [], $content = '' )
{
    add_filter( 'wp_get_attachment_image_src', __NAMESPACE__ . '\\src' , 10, 3 );
    $out = wp_playlist_shortcode( $atts, $content );
    remove_filter( 'wp_get_attachment_image_src', __NAMESPACE__ . '\\src' );    
    return $out;        
} );

function src( $image, $id, $size )
{
    add_filter( 'image_downsize', __NAMESPACE__ . '\\size', 10, 3 );
    return $image;
}

function size( $downsize, $id, $size )
{
    remove_filter( current_filter(), __FUNCTION__ );
    if( 'thumbnail' !== $size )
        return $downsize;   
    return image_downsize( $id, $size = 'large' );           // <-- Adjust size here!
}

Ici, nous changeons la taille du pouce de 'thumbnail' à 'large'.

Premièrement, nous ignorons le rappel du shortcode de la liste de lecture afin de mieux cibler nos filtres et de ne cibler que les codes abrégés de la liste de lecture.

Ensuite, nous ajoutons le filtre image_downsize à nos besoins pour appeler la fonction image_downsize() avec la taille de pouce souhaitée. Mais nous devons nous rappeler de supprimer immédiatement notre rappel de filtre pour éviter une boucle récursive infinie.

Plugin de démonstration - Différentes tailles

Mais ce serait plus flexible si nous pouvions écrire la taille du pouce en tant qu'attribut shortcode:

[playlist ids="12,34,56" _size="large"]
[playlist ids="12,34,56" _size="medium"]

Ici, nous préfixons notre attribut _size par un trait de soulignement, juste au cas où il serait pris en charge par core dans le futur.

Voici une modification de notre premier plugin de démonstration pour supporter cela (sous une forme compacte):

<?php
/* Plugin Name: Playlist With _size Attribute */

namespace WPSE238646\PlaylistThumbSize;

add_shortcode( 'playlist', [ (new Playlist), 'shortcode' ] );

class Playlist
{
    protected $_size;

    public function shortcode( $atts = [], $content = '' )
    {
        $allowed_sizes = (array) get_intermediate_image_sizes(); // <-- Allowed sizes
        $this->_size = 'thumbnail';  // <-- Default size
        if( ! empty( $atts['_size' ] ) && in_array( $atts['_size' ], $allowed_sizes ) )
            $this->_size = $atts['_size' ]; 
        add_filter( 'wp_get_attachment_image_src', [ $this, 'src' ] , 10, 3 );
        $out = wp_playlist_shortcode( $atts, $content );  // <-- Native playlist
        remove_filter( 'wp_get_attachment_image_src', [ $this, 'src' ] );
        return $out;       
    }     
    public function src( $image, $id, $size )
    {
        add_filter( 'image_downsize', [ $this, 'size' ], 10, 3 );
        return $image;
    }
    public function size( $downsize, $id, $size )
    {
        remove_filter( current_filter(), [ $this, 'size' ] );
        if( 'thumbnail' !== $size )
            return $downsize;  
        return image_downsize( $id, $this->_size ); // <--Apply new size
    }
} // end class

Ici, nous limitons les tailles autorisées à get_intermediate_image_sizes().

J'espère que vous pourrez tester cela plus avant et vous adapter à vos besoins!

4
birgire