Stellen Sie Google Web Fonts in die Warteschlange, ohne die Symbole in der URL durcheinander zu bringen

9

Einreihen von Google Web Fonts auf die übliche Weise, dh mithilfe der folgenden wp_enqueue_styleFunktion ...

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

... führt zu einem linkTag in der Kopfzeile wie folgt :

<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' />

Wie Sie sehen können, ist die resultierende URL verschlüsselt .

Ich bin mir ziemlich sicher, dass dies keine Probleme aufwirft, aber um die Dinge sauber und klar zu halten, möchte ich fragen: Gibt es eine Möglichkeit, Google Web Fonts (über functions.phpund nicht über ein Plugin) so in die Warteschlange zu stellen , dass die URL ausgegeben wird ? ist nicht verschlüsselt?

Das ist so:

<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' />

Grund für Kopfgeld

Die Antwort von @ webaware ist nahezu perfekt, insbesondere weil sie der Methode ähnelt, mit der die Google Web-Schriftart "Open Sans" im Thema " Twenty Twelve" in die Warteschlange gestellt wird .

Das einzige Problem in der Ausgabe ist, dass es so ist:

<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' />

Beachten Sie die &#038;? Es sollte sein &, sonst haben die latinbereitgestellten Schriftdateien nur die Glyphen (dh der subsetParameter in der URL wird vernachlässigt, es sei denn, Sie verwenden &und NICHT seine HTML-Entität).

Jeder, der helfen kann, die Antwort von @ webaware so zu ändern, dass die Ausgabe so aussieht ...

<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' />

... gewinnt das Kopfgeld.

da ich bin
quelle
Nicht ganz sicher, was Sie hier wollen; Möchten Sie Latin + Latin-Ext-Teilmengen haben (was dies tut), oder möchten Sie, dass es keine Teilmenge ist (was durch Entfernen des Elements 'Subset' aus dem Array erreicht werden kann)?
webaware

Antworten:

24

WordPress weiß, was es hier macht. Ehrlich.

Wenn Sie ein kaufmännisches Und in HTML rendern, sollten Sie immer &amp;oder verwenden &#038;. Der Browser konvertiert es dann in, &bevor die HTTP-Anforderung tatsächlich ausgelöst wird. Überzeugen Sie sich selbst, indem Sie die Netzwerkaufrufe in einem Webinspektor-Tool überprüfen. Sie verlieren Ihre nicht-lateinischen Untergruppen nicht wirklich.

Beachten Sie die &#038;? Es sollte & sein, andernfalls haben die bereitgestellten Schriftdateien nur die lateinischen Glyphen (dh der Teilmengenparameter in der URL wird vernachlässigt, es sei denn, Sie verwenden & und NICHT seine HTML-Entität).

Dies sagt mir, dass Sie die Quelle überprüft haben, um festzustellen, ob ein kaufmännisches Und-Zeichen vorliegt, ohne das resultierende Verhalten tatsächlich zu überprüfen. Ja, es tritt auf, wenn Sie eine URL mit einem maskierten kaufmännischen Und in eine Adressleiste einfügen. Aber nicht, wenn Sie eine ordnungsgemäß codierte und maskierte URL in einem HTML-src- oder href-Attribut haben.

Sie sollten unter http://www.blooberry.com/indexdot/html/topics/urlencoding.htm nach weiteren unsicheren und reservierten Zeichen suchen . Beide Gruppen sollten immer codiert sein.

Andrew Nacin
quelle
1
Eine sehr schöne Erklärung, danke, dass du dir die Zeit genommen hast, Andrew!
webaware
Sie sagen also ... Wenn Sie eine ordnungsgemäß codierte URL in einem HTML-src- oder href-Attribut (dh http://fonts.googleapis.com/css?family=Ubuntu+Condensed&#038;subset=latin,latin-ext) haben, entspricht die Art und Weise, wie der Browser sie behandelt, der Eingabe durch den Benutzer http://fonts.googleapis.com/css?family=Ubuntu+Condensed&subset=latin,latin-ext(dh mit der tatsächlichen &und nicht der HTML-Entität) in die Adressleiste. Ist das korrekt? Wenn ja, danke für die klare Erklärung. :)
its_me
2
Richtig. Ich habe meine Antwort leicht bearbeitet, um sie etwas klarer zu machen. In diesem Fall ist das kaufmännische Und eine maskierte HTML-Entität, nicht URL-codiert. Es sollte nicht codiert werden (was der Fall wäre %38), da es in seiner speziellen URL-Rolle verwendet wird. URL - Codierung ein reserviertes oder unsichere Zeichen wie |, :oder Leerzeichen getrennt sind, und auch gefördert werden .
Andrew Nacin
@ AndrewNacin: Nur ein Fehler, aber: Bei dieser URL zu blooberry.com geht es eigentlich um URL-codierende Zeichen, nicht um HTML-codierende Zeichen. Das Problem, das Sie ansprechen, ist das letztere, nicht das erstere.
webaware
Ich habe in meiner Antwort und in meinem Kommentar über beides gesprochen. Sie haben sich in Ihrer ursprünglichen Frage um beides Sorgen gemacht.
Andrew Nacin
5

Versuchen Sie dies (wird auch HTTP vs HTTPS behandeln):

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' );
webaware
quelle
Basiert dies zufällig auf dem Thema Twenty Twelve ? : P
its_me
Sehr wahrscheinlich, wo ich es gesehen habe :), aber jetzt ist alles nur ein Teil des Kits.
Webaware
1
Eigentlich sind sie gleich. Der Browser sieht &#038;wie &und lädt genau die gleiche URI. Zum Testen habe ich einfache HTML-Seiten mit beiden geladen und den Cache vor dem Laden geleert. beide haben die gleichen Schriftdateien (gleiche Größe) geladen. Versuch es.
Webaware
2

Basierend auf dieser Antwort könnten Sie so etwas wie diesen ungetesteten Code ausprobieren :

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;
}
Fuxia
quelle
Ja, es funktioniert irgendwie, außer wie die Versionierung durchgeführt wird (falsch?). Die Ausgabe sieht folgendermaßen aus: <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' />- Beachten Sie & # 038; ver = 3.5 ? Es sollte eher ? Ver = 3.5 sein . Irgendeine Lösung im Sinn? Danke für die Antwort. :)
its_me
Sie können keine Sekunde verwenden ?. Dies würde zu einer ungültigen URL für Google führen.
Fuxia
http://fonts.googleapis.com/css?family=Ubuntu%20Condensed|Open%20Sans:400italic,700italic,400,700?ver=3.5wird gut geladen. Oder vermisse ich deinen Standpunkt?
its_me
Das Argumenttrennzeichen ist &nicht ?. Sie können sich nicht auf die Großzügigkeit von Google verlassen.
Fuxia
Diese Funktion ist veraltet "clean_url" -> codex.wordpress.org/Function_Reference/clean_url , Sie sollten eine andere verwenden.
Ed T.
1

Eigentlich ist es so einfach:

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

Und das sollte ausgeben:

<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' />

Das ist ziemlich nah an , was ich gewollt hätte (nur bedauern ist , dass &wird &#038;in der Ausgabe). Aber dann wurde mir klar, dass es nicht wirklich wichtig ist, hauptsächlich dank Andrew Nacins Antwort .

Aber ich muss allen für ihre Bemühungen danken.

da ich bin
quelle