Enqueue Google Web Fonts mà không làm rối các biểu tượng trong URL


9

Sử dụng Google Web Fonts theo cách thông thường, nghĩa là sử dụng wp_enqueue_stylechức năng như vậy ...

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

... Kết quả là một linkthẻ được đặt trong tiêu đề như vậy:

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

Như bạn có thể thấy, URL kết quả được mã hóa .

Tôi khá chắc chắn rằng nó không gây ra vấn đề gì, nhưng để giữ mọi thứ sạch sẽ và rõ ràng, tôi muốn tiếp tục và hỏi - Có cách nào để chinh phục Google Web Fonts (thông qua functions.phpvà không phải là plugin) theo cách mà URL xuất ra không được mã hóa?

Giống như vậy:

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

Lý do cho tiền thưởng

Câu trả lời của @ webkn gần như hoàn hảo, đặc biệt là vì nó tương tự như phương pháp được sử dụng trong việc mê hoặc 'Phông chữ Web Google' của Sans trong chủ đề Twenty Tw 12 .

Vấn đề duy nhất ở đầu ra là nó như thế này:

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

Thông báo &#038;? Nó phải được &, nếu không thì font-file phục vụ chỉ có latinglyphs (tức là subsettham số trong URL sẽ bị bỏ qua trừ khi bạn sử dụng &và không thực thể HTML của nó).

Bất cứ ai có thể giúp sửa đổi câu trả lời của @ webkn để đầu ra trông như thế này ...

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

... thắng tiền thưởng.


Không hoàn toàn chắc chắn những gì bạn muốn ở đây; Bạn có muốn có các tập con latin + latin-ext (điều này không), hoặc bạn muốn nó không tập hợp con (có thể đạt được bằng cách loại bỏ phần tử 'tập hợp con' khỏi mảng)?
web biết

Câu trả lời:


24

WordPress biết những gì nó đang làm ở đây. Thật thà.

Khi kết xuất ký hiệu và HTML, bạn phải luôn sử dụng &amp;hoặc &#038;. Trình duyệt sau đó chuyển đổi nó thành &trước khi thực sự thực hiện yêu cầu HTTP. Xem cho chính mình bằng cách kiểm tra các cuộc gọi mạng trong một công cụ kiểm tra web. Bạn không thực sự mất tập hợp phi Latin của bạn.

Thông báo &#038;? Nó phải là &, nếu không, các tệp phông chữ được cung cấp chỉ có các glyph Latin (tức là tham số tập hợp con trong URL bị bỏ qua trừ khi bạn sử dụng & và KHÔNG phải là thực thể HTML của nó).

Điều này cho tôi biết bạn đã kiểm tra nguồn để thấy rằng có một dấu và thoát, mà không thực sự xác minh hành vi kết quả. Có, nó xảy ra khi bạn dán một URL với dấu và thoát trong thanh địa chỉ. Nhưng không phải khi bạn có một URL được mã hóa và thoát đúng trong thuộc tính src or href.

Bạn nên xem qua http://www.blooberry.com/indexdot/html/topics/urlencoding.htmlm để biết thêm các ký tự không an toàn và dành riêng. Cả hai nhóm phải luôn được mã hóa.


1
Một lời giải thích rất tốt, cảm ơn vì đã dành thời gian cho Andrew!
web biết

Vì vậy, bạn đang nói ... khi bạn có một URL được mã hóa chính xác trong thuộc tính src or href (nghĩa là http://fonts.googleapis.com/css?family=Ubuntu+Condensed&#038;subset=latin,latin-ext), cách trình duyệt xử lý nó tương đương với người dùng nhập http://fonts.googleapis.com/css?family=Ubuntu+Condensed&subset=latin,latin-ext(nghĩa là với thực &thể HTML chứ không phải thực thể HTML) trong thanh địa chỉ. Đúng không? Nếu vậy, cảm ơn cho lời giải thích rõ ràng. :)
it_me

2
Chính xác. Tôi chỉnh sửa câu trả lời của mình một chút để làm cho nó rõ ràng hơn một chút. Trong trường hợp này, ký hiệu và là một thực thể HTML đã thoát, không được mã hóa URL. Nó không nên được mã hóa (sẽ được %38) bởi vì nó đang được sử dụng trong vai trò URL đặc biệt của nó. URL mã hóa ký tự dành riêng hoặc không an toàn như |, :hoặc không gian riêng biệt, và cũng có thể khuyến khích.
Andrew Nacin

@AndrewNacin: chỉ là một nitput, nhưng: URL đó cho blooberry.com thực sự là về các ký tự mã hóa URL, không phải là các ký tự mã hóa HTML. Vấn đề bạn đang giải quyết là cái sau chứ không phải cái trước.
web biết

Tôi đã nói về cả hai trong câu trả lời của tôi, và bình luận. Bạn đã lo lắng về cả hai trong câu hỏi ban đầu của bạn.
Andrew Nacin

5

Hãy thử điều này (cũng sẽ xử lý 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' );

Tình cờ, điều này có dựa trên chủ đề Twenty Tw 12 không? : P
it_me

Rất có khả năng tôi đã nhìn thấy nó :) nhưng bây giờ tất cả chỉ là một phần của bộ sản phẩm.
web biết

1
Thật ra, họ giống nhau. Trình duyệt coi &#038;như &và tải giống hệt nhau URI. Để kiểm tra, tôi đã tải các trang HTML đơn giản bằng cả hai và xóa bộ đệm trước khi tải; cả hai đều tải cùng một tệp phông chữ (cùng kích thước). Thử nó.
web biết

2

Dựa trên câu trả lời này, bạn có thể thử một cái gì đó giống như mã chưa được kiểm tra này :

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

Vâng, nó hoạt động tốt, ngoại trừ cách thực hiện phiên bản (sai?). Đầu ra trông giống như: <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' />- thông báo & # 038; ver = 3.5 ? Nó nên là ? Ver = 3.5 . Bất kỳ sửa chữa trong tâm trí? Cảm ơn câu trả lời. :)
it_me

Bạn không thể sử dụng một giây ?. Điều đó sẽ dẫn đến một URL không hợp lệ cho Google.
fuxia

http://fonts.googleapis.com/css?family=Ubuntu%20Condensed|Open%20Sans:400italic,700italic,400,700?ver=3.5đang tải lên tốt Hay tôi đang thiếu quan điểm của bạn?
it_me

Dấu phân cách đối số là &, không ?. Bạn không thể dựa vào sự hào phóng của Google.
fuxia

Hàm này đã không được dùng nữa "clean_url" -> codex.wordpress.org/Function_Reference/clean_url , bạn nên sử dụng cái khác.
Ed T.

1

Trên thực tế, nó đơn giản như thế này:

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

Và điều đó sẽ xuất ra:

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

Điều đó khá gần với những gì tôi muốn (chỉ tiếc là nó &trở thành &#038;đầu ra). Nhưng sau đó tôi nhận ra nó không thành vấn đề, thực sự, phần lớn là nhờ câu trả lời của Andrew Nacin .

Nhưng tôi phải cảm ơn mọi người vì những nỗ lực của họ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.