CDN başarısız olursa Font Awesome için yerel bir yedek nasıl sağlanır?


14

Bir Wordpress teması geliştirmeye çalışıyorum ve CDN başarısız olursa Font Awesome için yerel bir geri dönüş nasıl sağlanacağını anlamaya çalışıyorum ya da temamı internet bağlantısı olmadan yerel bir sunucuda geliştiriyorum.

Aklımda çözüm böyle bir şeydir (sözde kod):

if ( $CDN_IS_AVAILABLE ) { 
        wp_enqueue_style( 'font-awesome', '//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css', false );
    } else {
        wp_enqueue_style('font-awesome', get_template_directory_uri() . '/css/font-awesome/css/font-awesome.min.css', false, '4.0.3' );
    }

Teşekkür ederim!



@ MayeenulIslam teşekkürler ama CDN kullanılabilir bile yanlış döndürüyor gibi görünüyor.
Knott

2
En azından birkaç yol var, ancak bir CDN kullanmanın tek nedeni performanstır, ancak bulmanın herhangi bir yolunun performansı daha da kötüleştireceğinden eminim, bu yüzden imho hiçbir anlam ifade etmiyor. Tema paylaşmak / satmak için ise, yalnızca yerel kopyaya giderim, kullanıcılara istedikleri takdirde CDN sürümüne geçmek için kolay bir yol bıraktığınızdan emin olurum. Tema yalnızca kendiniz içinse birini seçin. En ünlü CDN'lerin çalışmama süresinin çok düşük olduğunu düşünün (ve cdstperf.com'a göre bootstrapcdn en güvenilir olanlardan biridir ).
gmazzap

Yeni başlayanlar için yedeklemeyi nasıl yöneteceğiniz konusunda genel bir fikriniz var mı? JS yedekleri değişkenleri kontrol güveniyor biliyorum, ne CSS yükü kontrol emin olmak için emin değilim.
Rarst

1
Tabii ki, bunun için PHP'den ekstra talepte bulunmam. Buradaki zorluk bu - yeni başlayanlar için CSS yükünü kontrol etmenin iyi bir yolunu düşünemiyorum.
Rarst

Yanıtlar:


15

Sorun şu ki , CSS'nin PHP aracılığıyla bir sayfaya etkili bir şekilde eklenip eklenmediğini kontrol etmenin imkansız olduğundan eminim : CSS tarayıcı tarafından ayrıştırıldı, bu yüzden istemci tarafında ve sunucu tarafında tamamen bir etkisi yok.

Tabii ki, PHP'de CDN'nin duyarlı olup olmadığını kontrol etmek mümkündür ...

seçenek 1

Bir istek gönderin ve HTTP durumu 200 ile yanıt veriyorsa, kullanın. Gibi bir şey:

function font_awesome_css() {
    $url = 'http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css';
    $cdn = wp_remote_get( $url );
    if ( (int) wp_remote_retrieve_response_code( $cdn) !== 200 ) {
        $url = get_template_directory_uri() . '/css/font-awesome/css/font-awesome.min.css';
    }
    wp_enqueue_style( 'font-awesome', $url, false );
}

biri HTTP kontrolü, diğeri gömülü CSS için 2 HTTP isteği ile sonuçlanır: gerçekten kötü .

seçenek 2

function font_awesome_css() {
    $url = 'http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css';
    $cdn = wp_remote_get( $url );
    if ( (int) wp_remote_retrieve_response_code( $cdn ) === 200 ) {
        $css = wp_remote_retrieve_body( $cdn );
        add_action( 'wp_head', function() use( $css ) {
            $absolute = "//netdna.bootstrapcdn.com/font-awesome/4.0.3/fonts/";
            $css = str_replace( "../fonts/", $absolute, $css );
            echo '<style type="text/css">' . $css . '</style>';
        } );
    } else {
        $url = get_template_directory_uri() . '/css/font-awesome/css/font-awesome.min.css';
        wp_enqueue_style( 'font-awesome', $url, false );
    }
}

Bu daha da kötü :

  • İş wp_enqueue_styleakışını mahveder : Bir eklenti Font Awesome eklerse, 2 kez eklenir.
  • HTTP isteklerinin sayısı aynıdır, ancak normalde 2 istek paralel olarak çalışır , bu nedenle ilk istek yanıtını beklemesi gerektiğinden sayfanın PHP nesli yavaşlar.
  • Bu, tarayıcının CSS'yi önbelleğe almasını da engeller, bu nedenle farklı stillerde aynı stili kullanırsanız, ziyaret edilen her sayfada CDN isteğini zorlarsınız. Normal iş akışını kullanırken, ilk CSS'den sonraki sayfalar önbellekten alınır.

Gerçekten, yok evde bunu.

Asıl önemli olan PHP'yi kullanarak CDN isteğini kontrol edebilmeniz, ancak CSS'yi doğrulayamamanızdır, bu nedenle tüm çabalarınız daha iyi yerine daha kötü performansla sonuçlanır.

Saygılarımızla, sizinki herkese açık bir temaysa, kullanıcılara bir CDN seçmeleri için bir yol sağlayan yalnızca yerel kopyayı kullanmanızı öneririz:

if ( ! function_exists( 'font_awesome_css' ) ) {
    function font_awesome_css() {
        $_url = get_template_directory_uri() . '/css/font-awesome/css/font-awesome.min.css';
        $url = apply_filters( 'font_awesome_css_url', $_url );
        wp_enqueue_style( 'font-awesome', $url, false );
    }
}

Böylece kullanıcılar alt temayı kullanarak işlevi tamamen geçersiz kılabilir 'font_awesome css_url've URL'yi değiştirmek için filtreyi de kullanabilir .

Ayrıca bazı üst düzey barındırma sağlayıcılarının yerel varlıkları otomatik olarak CDN'ye dönüştürdüğünü ve CDN'ye her şeye izin veren eklentiler olduğunu düşünün ; halka açık bir temanın CDN'yi hiç kullanmamasının nedeni budur.

Tema kendinizse, bir seçim yapın. En ünlü CDN'lerin çalışmama süresinin çok düşük olduğunu düşünün (ve cdstperf.com'a göre bootstrapcdn en güvenilir olanlardan biridir ). Barındırma hizmetinizin bootstrapcdn'den% daha büyük bir kesintiye sahip olduğundan eminim, bu yüzden insanların sitenizi hiç görmemesi, kırık simgelerle görmekten daha fazla.

Kirli yol

Söylendiği gibi, PHP CSS'yi kontrol edemez, çünkü CSS oluşturma istemci tarafında olur, ancak istemci tarafı kontrolünü kullanabilirsiniz: JavaScript.

İlk CDN kullanarak CSS gömme:

function font_awesome_css() {
    $url =  '//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css';
    wp_enqueue_style( 'font-awesome', $url, false );
} 

Bundan sonra, altbilginize biraz JavaScript ekleyin:

/*
Normally the JS should be properly enqueued and the URL
passed via wp_enqueue_script, but this is a proof of concept,
more than real code.
*/
add_action( 'wp_footer', function() {
    $cssurl = get_template_directory_uri() . '/css/';
    ?>
    <span id="facheck" data-cssuri="<?php echo $cssurl; ?>" class="fa" style="display:none">
    </span>
    <script>
        jQuery(document).ready(function($) {
            var $check = $('#facheck');
            if ( $check.css('fontFamily') !== 'FontAwesome' ) {
                // Font Awesome not loaded!
                // Remove current CSS link
                $('#font-awesome-css').remove;
                // Add the local version
                var local = '<link rel="stylesheet" type="text/css" href="' +
                    $check.data('cssuri') + // This is the theme CSS folder URL
                    'font-awesome/css/font-awesome.min.css" />';
                $('head').append( local );
            }
        });
    </script>
    <?php
});

Bu kod, sayfa yüklendiğinde çalışır ve 'fa' sınıfına sahip altbilgiye eklenen görünmez yayılma alanının font-family özelliğinin 'FontAwesome' olarak ayarlanıp ayarlanmadığını denetler. Bu, Font Awesome tarafından ayarlanır, bu yüzden doğru değilse, CSS'nin yüklü olmadığı anlamına gelir. Böyle bir durumda kod, yerel CSS'yi başlığa eklemek için JavaScript kullanır.

(Bu kodu test etmek wp_enqueue_styleiçin yanlış bir CDN URL'si yerleştirebilir ve ne olacağını görebilirsiniz)

Bu nedenle, nadiren bir CDN mevcut değilse, tüm stiller beklendiği gibi gösterilir (bazı milisaniyeler için kullanıcılar 'kırık' CSS simgeleri görür, çünkü sayfa yüklendikten sonra CSS eklenir).

Şimdi, CDN'lerin çok güvenilir olduğunu düşünürsek, kırık simgeleri görecek insanların% 1'inden azı için bu hack yapmaya değer mi? Bu soruyu cevaplamak size kalmış.


Uzun zamandır böyle bir konuda bu kadar karmaşık ve derin bir yaklaşım görmedim. Bu beni tamamen temizledi. Şimdi sanırım CDN'i sadece bir tema seçeneği olarak kullanacağım ve kullanıcı seçim özgürlüğü bırakacağım. Teşekkür ederim!
Knott

Uzun zamandır böyle bir çözüm arıyordum, bu yüzden "Kırık simgeleri görecek insanların <% 1'i için bu hack'i yapmaya değer mi?" Belki bir yükleme döndürücü eklemek işe yarayabilir?
Carl Alberto

2

Sunucu tarafı denetimi de kurşun geçirmez değildir. Sunucunuz California'da bulunuyorsa, çekinizde California CDN'nin Veri Merkezi kullanılır. Kullanıcınız Çin'de bulunuyorsa, büyük olasılıkla tamamen farklı bir Veri Merkezi kullanıyor olacaktır. En azından, böyle çalıştığını düşünüyorum.

Her neyse, işte geliştirilmiş bir jquery çözümü:

http://jsfiddle.net/skibulk/fp1gqnyc/

<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
<script>
    (function($){
        var $span = $('<span class="fa" style="display:none"></span>').appendTo('body');
        if ($span.css('fontFamily') !== 'FontAwesome' ) {
            // Fallback Link
            $('head').append('<link href="/wordpress//css/font-awesome.min.css" rel="stylesheet">');
        }
        $span.remove();
    })(jQuery);
</script>

parlak ve yazı tipi müthiş çok daha geçerli bir yaklaşım, paylaşım için teşekkürler. Buradaki ve diğer yerlerdeki diğer çözümlerin aksine agnostik de eklemeliyim.
oucil

1
Zaman aşımı olmadığından, CDN örneği denetimden sonra yüklemeyi bitirirse, bu, Font Awesome'i iki kez yüklemeye başlar fontFamily.
Dan Dascalescu

1
@DanDascalescu CSS dosyaları varsayılan olarak senkronize olarak (engelleme) yüklenmiyor mu? CDN yüklenene veya başarısız olana kadar sayfanın devam etmeyeceğine inanıyorum?
skibulk

1
CSS senkronize olarak yüklenir, ancak yazı tipinin kendisi yalnızca onu kullanan metin oluşturulduğunda yüklenir. İşte bunu gösteren bir JSbin .
Dan Dascalescu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.