Accoda i caratteri Web di Google senza incasinare i simboli nell'URL


9

Accodare Google Web Fonts nel solito modo, cioè usando la wp_enqueue_stylefunzione in questo modo ...

function wpse_google_webfonts() {
    wp_enqueue_style( 'google-webfonts', 'http://fonts.googleapis.com/css?family=Ubuntu+Condensed|Open+Sans:400italic,700italic,400,700' );
}
add_action( 'wp_enqueue_scripts', 'wpse_google_webfonts' );

... risulta in un linktag inserito nell'intestazione in questo modo:

<link rel='stylesheet' id='google-webfonts-css'  href='http://fonts.googleapis.com/css?family=Ubuntu+Condensed%7COpen+Sans%3A400italic%2C700italic%2C400%2C700&#038;ver=3.5' type='text/css' media='all' />

Come puoi vedere, l'URL risultante è codificato .

Sono abbastanza sicuro che non pone problemi, ma per mantenere le cose pulite e chiare, vorrei andare avanti e chiedere: c'è un modo per accodare i caratteri Web di Google (tramite functions.phpe non un plug-in) in modo che l'URL emetta non è codificato?

È così:

<link rel='stylesheet' id='google-webfonts-css'  href='http://fonts.googleapis.com/css?family=Ubuntu+Condensed|Open+Sans:400italic,700italic,400,700?ver=3.5' type='text/css' media='all' />

Motivo della generosità

La risposta di @ webaware è quasi perfetta, soprattutto perché è simile al metodo utilizzato per accodare il font Web di Google "Open Sans" nel tema Twenty Twelve .

L'unico problema nell'output è che è così:

<link rel='stylesheet' id='twentytwelve-fonts-css'  href='http://fonts.googleapis.com/css?family=Ubuntu+Condensed|Open+Sans:400italic,700italic,400,700&#038;subset=latin,latin-ext' type='text/css' media='all' />

Notare il &#038;? Dovrebbe essere &, altrimenti i file di caratteri serviti hanno solo i latinglifi (cioè il subsetparametro nell'URL viene trascurato a meno che tu non usi &e NON la sua entità HTML).

Chiunque possa aiutare a modificare la risposta di @ webaware in modo che l'output assomigli a questo ...

<link rel='stylesheet' id='twentytwelve-fonts-css'  href='http://fonts.googleapis.com/css?family=Ubuntu+Condensed|Open+Sans:400italic,700italic,400,700&subset=latin,latin-ext' type='text/css' media='all' />

... vince la taglia.


Non sono sicuro di cosa tu voglia qui; vuoi avere sottoinsiemi latin + latin-ext (cosa che fa questo), o vuoi che non sottoset (che può essere ottenuto rimuovendo l'elemento 'subset' dall'array)?
webaware il

Risposte:


24

WordPress sa cosa sta facendo qui. Onesto.

Quando si esegue il rendering di una e commerciale in HTML, è necessario utilizzare sempre &amp;o &#038;. Il browser quindi lo converte &prima di lanciare effettivamente la richiesta HTTP. Guarda tu stesso controllando le chiamate di rete in uno strumento di ispezione web. In realtà non stai perdendo i tuoi sottoinsiemi non latini.

Notare il &#038;? Dovrebbe essere &, altrimenti i file di font serviti hanno solo glifi latini (cioè il parametro del sottoinsieme nell'URL viene trascurato a meno che tu non usi & e NON la sua entità HTML).

Questo mi dice che hai ispezionato la fonte per vedere che c'è una e commerciale fuggita, senza verificare effettivamente il comportamento risultante. Sì, si verifica quando si incolla un URL con una e commerciale con escape in una barra degli indirizzi. Ma non quando si dispone di un URL con codifica e escape correttamente in un attributo src o href HTML.

Si consiglia di consultare http://www.blooberry.com/indexdot/html/topics/urlencoding.htm per ulteriori caratteri non sicuri e riservati. Entrambi i gruppi dovrebbero essere sempre codificati.


1
Una spiegazione molto bella, grazie per aver dedicato del tempo Andrew!
webaware il

Quindi, stai dicendo ... quando hai un URL correttamente codificato in un attributo src o href HTML (ad es. http://fonts.googleapis.com/css?family=Ubuntu+Condensed&#038;subset=latin,latin-ext), Il modo in cui il browser lo tratta equivale all'inserimento dell'utente http://fonts.googleapis.com/css?family=Ubuntu+Condensed&subset=latin,latin-ext(ad es. Con l' &entità HTML effettiva e non) in la barra degli indirizzi. È corretto? In tal caso, grazie per la chiara spiegazione. :)
its_me

2
Corretta. Ho modificato leggermente la mia risposta per renderla un po 'più chiara. In questo caso, la e commerciale è un'entità HTML con escape, non con codifica URL. Non dovrebbe essere codificato (che sarebbe %38) perché viene utilizzato nel suo ruolo URL speciale. URL codifica un carattere riservato o non sicuri, come |, :o gli spazi sono separati, e anche incoraggiato.
Andrew Nacin,

@AndrewNacin: solo un nitput, ma: quell'URL su blooberry.com riguarda in realtà caratteri di codifica URL, non caratteri di codifica HTML. Il problema che stai affrontando è il secondo, non il primo.
webaware il

Ho parlato di entrambi nella mia risposta e commento. Eri preoccupato per entrambi nella tua domanda originale.
Andrew Nacin,

5

Prova questo (gestirà anche HTTP vs HTTPS):

function wpse_google_webfonts() {
    $protocol = is_ssl() ? 'https' : 'http';
    $query_args = array(
        'family' => 'Ubuntu+Condensed|Open+Sans:400italic,700italic,400,700',
        'subset' => 'latin,latin-ext',
    );

    wp_enqueue_style('google-webfonts',
        add_query_arg($query_args, "$protocol://fonts.googleapis.com/css" ),
        array(), null);
}

add_action( 'wp_enqueue_scripts', 'wpse_google_webfonts' );

Per caso, questo si basa sul tema Twenty Twelve ? : P
its_me,

Molto probabilmente dove l'ho visto :) ma ora fa tutto parte del kit.
webaware il

1
In realtà, sono gli stessi. Il browser vede &#038;come &e carichi esattamente lo stesso URI. Per testare, ho caricato semplici pagine HTML con entrambi e ho cancellato la cache prima del caricamento; entrambi hanno caricato gli stessi file dei caratteri (stesse dimensioni). Provalo.
webaware il

2

Sulla base di questa risposta potresti provare qualcosa di simile a questo codice non testato :

add_filter( 'clean_url', 'wpse_77227_decode_googlefont_url' );

function wpse_77227_decode_googlefont_url( $url )
{
    $host = parse_url ($url, PHP_URL_HOST );

    if ( 'fonts.googleapis.com' === $host )
        return urldecode( $url );

    return $url;
}

Sì, funziona un po ', tranne il modo in cui viene eseguita la versione (erroneamente?). L'output è simile a: <link rel='stylesheet' id='google-webfonts-css' href='http://fonts.googleapis.com/css?family=Ubuntu Condensed|Open Sans:400italic,700italic,400,700&#038;ver=3.5' type='text/css' media='all' />- avviso & # 038; ver = 3.5 ? Dovrebbe piuttosto essere ? Ver = 3.5 . Qualche soluzione in mente? Grazie per la risposta. :)
its_me il

Non puoi usare un secondo ?. Ciò comporterebbe un URL non valido per Google.
fuxia

http://fonts.googleapis.com/css?family=Ubuntu%20Condensed|Open%20Sans:400italic,700italic,400,700?ver=3.5si sta caricando bene. O mi manca il tuo punto?
its_me,

Il separatore di argomenti è &no ?. Non puoi fare affidamento sulla generosità di Google.
fuxia

Questa funzione è stata deprecata "clean_url" -> codex.wordpress.org/Function_Reference/clean_url , dovresti usarne un'altra.
Ed T.

1

In realtà, è semplice come questo:

wp_enqueue_style( 'google-webfonts', 'http://fonts.googleapis.com/css?family=Ubuntu+Condensed|Open+Sans:400italic,700italic,400,700&subset=latin,latin-ext', array(), null );

E questo dovrebbe produrre:

<link rel='stylesheet' id='google-webfonts-css'  href='http://fonts.googleapis.com/css?family=Ubuntu+Condensed|Open+Sans:400italic,700italic,400,700&#038;subset=latin,latin-ext' type='text/css' media='all' />

È abbastanza vicino a quello che avrei voluto (l'unico rimpianto è che &diventa &#038;in uscita). Ma poi ho capito che non importa, davvero, in gran parte grazie alla risposta di Andrew Nacin .

Ma devo ringraziare tutti per i loro sforzi.

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.