問題描述

以通常的方式排隊 Google Web 字體,即使用像 wp_enqueue_style 這樣的功能…

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

… 導致 link 標籤放置在標題中,如下所示:

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

您可以看到,結果網址被編碼。

我很確定它沒有問題,但為了保持清潔和清晰,我想繼續問 – 有沒有辦法排入 Google Web 字體 (通過 functions.php 而不是插件),URL 的方式輸出不編碼?

就這樣:

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

賞金原因

@ webaware 的答案接近完美,特別是因為它類似於 enqueuing ‘Open Sans’ Google Web Font in the Twenty Twelve 主題中使用的方法。

輸出中唯一的問題就是這樣:

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

注意&?它應該是&,否則 font-files 只服務於 latin 字形 (除非您使用& 而不是其 HTML 實體,否則 URL 中的 subset 參數被忽略) 。

任何人誰可以幫助修改 @ webaware 的答案,使輸出看起來像這樣…

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

贏得賞金。

最佳解決方案

WordPress 知道這是在做什麼。誠實。

在 HTML 中呈現& 符時,應始終使用&amp;& 。瀏覽器然後將其轉換為&,然後才能實際觸發 HTTP 請求。通過檢查 Web 檢查器工具中的網絡呼叫來查看自己。你實際上並沒有丟失你的 non-latin 子集。

Notice the &? It should be &, otherwise the font-files served only have the latin glyphs (i.e. the subset parameter in the URL is neglected unless you use & and NOT its HTML entity).

這告訴我,你已經檢查了源代碼,看到有一個轉義的& 符號,而不實際驗證結果的行為。是的,當您在地址欄中粘貼已轉義的& 符號的 URL 時,會發生這種情況。但是當您在 HTML src 或 href 屬性中具有正確編碼和轉義的 URL 時,不會。

您應該查看 http://www.blooberry.com/indexdot/html/topics/urlencoding.htm 的其他不安全和保留字符。這兩個組都應該被編碼。

次佳解決方案

嘗試這個 (也將處理 HTTP 與 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://googlefonts.admincdn.com/css" ),
        array(), null);
}

add_action( 'wp_enqueue_scripts', 'wpse_google_webfonts' );

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。