Modi per gestire il rendering SVG in wordpress?


9

Con l'avanzamento dei browser Internet, mi trovo sempre più a mio agio nell'usare SVGS durante la codifica di siti Web ... specialmente per icone e grafica semplice che può essere sostituita al volo da pngs.

Sembra che wordpress supporti quasi SVGS. Dico quasi perché:

  1. Non è di default un tipo di file consentito in wordpress. Quindi è necessario aggiungerlo prima di caricare SVG

  2. Non è possibile visualizzare una miniatura SVG nella Galleria multimediale. (vedi immagine sotto)

  3. A volte quando lo aggiungi all'editor (tramite il pulsante Aggiungi media) l'editor non conosce le dimensioni di svg, quindi anche se aggiunge lo svg come immagine, ha una larghezza e un'altezza pari a zero.

  4. Quando si fa clic su "modifica immagine" all'interno del popup di caricamento dei media, viene visualizzato il messaggio "L'immagine non esiste". Vedi l'immagine sotto.

Sto bene con l'articolo 1 in questo elenco, ma qualcuno ha capito come un elemento fisso 2 3 e 4?

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Aggiornamento sull'elemento 1:

Per consentire un nuovo tipo MIME (come SVG) puoi semplicemente aggiungere un hook in Functions.php

function allow_new_mime_type($mimes) {

    $mimes['svg'] = 'image/svg+xml';

    return $mimes;
}
add_filter( 'mime_types', 'allow_new_mime_type' );

Ora dovresti essere in grado di caricare SVG. Puoi trovare ulteriori informazioni in questo tutorial . Questo risolve solo l'articolo 1, che come ho detto prima, non è un problema per me (anche se penso che dovrebbe essere consentito per impostazione predefinita).

Aggiornamento sull'elemento 2:

Ho fatto qualche ricerca e ho rintracciato la funzione che decide se un allegato è un'immagine o no. Sembra che tutto dipenda da questa funzione in wp-Includes / post.php

/**
 * Check if the attachment is an image.
 *
 * @since 2.1.0
 *
 * @param int $post_id Attachment ID
 * @return bool
 */
function wp_attachment_is_image( $post_id = 0 ) {
    $post_id = (int) $post_id;
    if ( !$post = get_post( $post_id ) )
        return false;

    if ( !$file = get_attached_file( $post->ID ) )
        return false;

    $ext = preg_match('/\.([^.]+)$/', $file, $matches) ? strtolower($matches[1]) : false;

    $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );

    if ( 'image/' == substr($post->post_mime_type, 0, 6) || $ext && 'import' == $post->post_mime_type && in_array($ext, $image_exts) )
        return true;
    return false;
}

Come puoi vedere c'è una serie di estensioni di immagini valide definite in questa funzione. Non vedo alcun filtro che potrebbe essere utilizzato per modificare quell'array. Ma è un inizio ...

Non sono sicuro del motivo per cui l'ultima istruzione if restituisca false per svgs. Anche se non aggiungo l'estensione svg all'array $ image_exts, la prima condizione dovrebbe restituire vero, no?

if ( 'image/' == substr($post->post_mime_type, 0, 6)

Che controlla se 'image /' è richiesto ai primi sei caratteri nel tipo mime, che per svg è image / svg + xml (i primi sei sono "image /").

AGGIORNARE

A seguito di ulteriori accertamenti, sembra che il problema non riguardi affatto wp_attachment_is_image, ma perché le dimensioni dell'immagine (larghezza e altezza) non vengono aggiunte ai metadati dell'allegato quando viene caricato SVG. Questo perché la funzione per calcolare l'immagine utilizzata è la funzione php getimagesize (), che non restituisce una dimensione dell'immagine per SVG. Ho trovato una risposta su StackOverflow sulla funzione getimagesize e su come si comportano gli svgs. Vedi qui.


Installa il plug-in di supporto SVG visualizza lo svg nella galleria multimediale - wordpress.org/plugins/svg-support
Nuno Sarmento

Risposte:


10

Dai un'occhiata wp_prepare_attachment_for_js(), che è ciò che raccoglie i metadati degli allegati da utilizzare nelle pagine multimediali. Il filtro omonimo ci consente di aggiungere o modificare metadati.

Il seguente esempio può essere inserito in Functions.php. Nota: questo richiede il supporto SimpleXML in PHP.

function common_svg_media_thumbnails($response, $attachment, $meta){
    if($response['type'] === 'image' && $response['subtype'] === 'svg+xml' && class_exists('SimpleXMLElement'))
    {
        try {
            $path = get_attached_file($attachment->ID);
            if(@file_exists($path))
            {
                $svg = new SimpleXMLElement(@file_get_contents($path));
                $src = $response['url'];
                $width = (int) $svg['width'];
                $height = (int) $svg['height'];

                //media gallery
                $response['image'] = compact( 'src', 'width', 'height' );
                $response['thumb'] = compact( 'src', 'width', 'height' );

                //media single
                $response['sizes']['full'] = array(
                    'height'        => $height,
                    'width'         => $width,
                    'url'           => $src,
                    'orientation'   => $height > $width ? 'portrait' : 'landscape',
                );
            }
        }
        catch(Exception $e){}
    }

    return $response;
}
add_filter('wp_prepare_attachment_for_js', 'common_svg_media_thumbnails', 10, 3);

2

Questo non è qualcosa che puoi facilmente "hackerare" con un plugin o un piccolo set di codice.

Il fatto è che gli SVG, nel complesso, non sono "immagini" nel senso di tutte le immagini che sono venute prima. Gli SVG sono immagini basate su vettori e sono i primi a ottenere una reale trazione sul web.

Tutte le immagini precedenti erano basate su bitmap. Il sistema di gestione delle immagini di WordPress è stato scritto appositamente per gestirli, e questo design intrinseco si trova in ogni punto del sistema.

È un presupposto alla base che le immagini abbiano larghezze e altezze, per esempio. Gli SVG non hanno nessuno dei due, possono avere qualsiasi dimensione. Esiste un "editor" di base per le immagini integrato in WordPress, nessuna delle funzionalità che può davvero essere applicata agli SVG.

Il sistema multimediale viene lentamente riqualificato, con l'enfasi su "lentamente". C'è molta compatibilità con le versioni precedenti da mantenere e nuovi progetti da implementare. Inoltre, molte persone sono molto più interessate a supportare video, audio e playlist. Man mano che questo lavoro di riprogettazione viene eseguito e le sezioni della libreria diventano più astratte, questo tipo di cose diventerà più facile da supportare nel tempo. Ma non è ancora lì, e non lo sarà per un po '. Questo è il motivo per cui il tipo mime SVG non è supportato, perché l'aggiunta di quel tipo mime fino a quando tutti i pezzi sottostanti funzioneranno sarebbe una strada per la rottura.

Per gli SVG, wp_attachment_is_imagedovrebbe essere restituito falso, poiché wp_attachment_is_imageviene utilizzato per determinare se mostrare o meno il pulsante dell'editor e se image_downsizeprovare o meno a ridimensionare l'immagine nelle miniature e così via. Nessuno dei due avrebbe funzionato comunque per gli SVG. Per supportare correttamente gli SVG, è necessario scrivere un nuovo sistema per aggiungere interamente i metadati per quelle immagini, quindi aggiungere il supporto per esso in tutti i luoghi in cui potrebbero essere utilizzati i metadati. Come puoi immaginare, non è un piccolo lavoro.


1
Gli SVG hanno dimensioni (viewport e view box), sono solo più "virtuali" delle dimensioni fisse dipendenti dai pixel delle bitmap.
Rarst

1

Solo leggendo la fonte (non testando), posso vedere che l'estensione deve corrispondere:

if ( 'image/' == substr($post->post_mime_type, 0, 6) || $ext && 'import' == $post->post_mime_type && in_array($ext, $image_exts) )

che legge come (codice pseudo)

se image/sono i primi 6 caratteri nell'oggetto $ post proprietà post_mime_type O c'è un'estensione OR importè la proprietà post_mime_type $ post oggetti E l'estensione del file corrente è una di (Array)

E ciò significa che l'ultima affermazione deciderà sempre se ifsi rivela vero o no.

Da quello che posso leggere get_attached_file(), c'è un filtro che consentirebbe di falsificare l'estensione:

return apply_filters( 'get_attached_file', $file, $attachment_id );

In altre parole, potresti provare a restituire lo stesso file ma con un'estensione diversa. Non sarebbe in conflitto con altre parti, poiché il wp_attachment_is_image()giusto ritorna bool.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.