web-dev-qa-db-fra.com

Images réactives - Générer plusieurs images à partir du téléchargement du contrôle Theme Customizer?

Ainsi, après avoir fouillé dans le code, il semble que le filtre image_make_intermediate_size ne soit pas appelé par les différentes classes WP_Customize_Control() au niveau de WP_Customize_Image_Control() ou de son parent WP_Customize_Upload_Control().

Je cherche à générer automatiquement des images de différentes tailles, pour une diffusion d'images réactive, et j'ai besoin d'exécuter la fonction image_make_intermediate_size() avec certaines tailles personnalisées spécifiques à mon contrôle personnalisé étendu. Vous ne savez tout simplement pas comment vous assurer que les images téléchargées appellent cette fonction principalement parce que je n'ai pas été en mesure de localiser ou comment la fonctionnalité de téléchargement de WP_Customize_Control() est "décrochée" du comportement de téléchargement par défaut où la fonction est normalement exécutée.

Notez que la façon dont cela fonctionne est évidemment la meilleure option. Ne voulez pas que chaque image téléchargée via le personnalisateur de thème génère automatiquement toutes les tailles d'image par défaut, mais pour mon cas d'utilisation, je préfère utiliser les fonctionnalités natives et simplement transmettre des informations uniques. la taille des paramètres à image_make_intermediate_size().

2
Brian

Si quelqu'un a une meilleure solution, je suis ouvert à cela, cependant, ce que j'ai proposé semble bien fonctionner.

Fondamentalement, le code suivant attend juste que l'image se termine, puis s'accroche à l'action add_attachment. Une fois la première ajoutée, nous nous connectons puis générons les nouvelles images via l’identifiant de publication (pour la pièce jointe d’image), qui est la seule donnée transmise par l’action add_attachment.

D'abord, nous obtenons l'image en appelant la poste par ID, puis un peu de regex enregistre les différents chemins de fichier, nom de fichier et autres bits de données. Notez que j'ajoute de manière récursive 3 images de tailles différentes, donc changez-le si vous souhaitez simplement créer une image ou des images de tailles différentes. De plus, j'ai nommé mon thème comme condition préalable aux données $_POST. En regardant ces données sur diverses actions de téléchargement d'images, il semble que ce soit le moyen le plus concret de définir une condition pour être à l'intérieur du personnaliseur de thème. Il n'y a pas grand-chose à faire, mais aucune des zones utilisant l'éditeur d'images n'inclut $_POST['post_data']['theme']; remplacez-le donc par le nom de votre thème ou utilisez property_exists si vous souhaitez qu'il s'applique à tous les thèmes et uniquement au personnalisateur.

add_filter('add_attachment','generate_responsive_sizes');

function generate_responsive_sizes( $attachment_id ) {

    $image_data = get_post( $attachment_id );

    // quit if the post_type is not attachment and mime_type is not jpeg/jpg/gif
    if ( $image_data->post_type != 'attachment' || $image_data->post_mime_type != ( 'image/jpeg' || 'image/png' || 'image/gif' ) )
        return false;

    // quit if the theme is not pure - only PURE gets responsive images, add new themes with responsive images  here
    if ( $_POST['post_data']['theme'] != 'pure' )
        return false;

    $file = substr( strrchr( $image_data->guid, '/' ), 1 );
    $filepath = str_replace( $file, '', $image_data->guid );
    $file_arr = preg_split( '/\./', $file );
    $filename = $file_arr[0];
    $file_ext = $file_arr[1];
    $upload_dir = wp_upload_dir();

    $sizes = array(
            '1024' => array(
                    'width' => 1024,
                    'height' => 768,
                    'crop' => true,
                ),
            '1680' => array(
                    'width' => 1680,
                    'height' => 1050,
                    'crop' => true,
                ),
            '2560' => array(
                    'width' => 2560,
                    'height' => 1440,
                    'crop' => true,
                ),
        );

    if ( ! is_wp_error( $image ) ) {
        foreach ($sizes as $key => $value) {
            $image = wp_get_image_editor( $image_data->guid );
            $dimensions = $image->get_size();
            if ( $dimensions['width'] < $value['width'] && $dimensions['height'] < $value['height'] ) {
                continue;
            }
            $image->resize( $value['width'], $value['height'], $value['crop'] );
            if ( $dimensions['width'] < $value['width'] ) {
                $value['width'] = $dimensions['width'];
            }
            $image->save( $upload_dir['path'] . '/' . $filename . '-' . $value['width'] . 'x' . $value['height'] . '.' . $file_ext );
        }
    }

}
2
Brian