wake-up-neo.com

wp enqueue script benutzt scripts von cdn mit einem safety callback

Ich möchte verschiedene Skripte und Stile von einem entfernten CDN einbinden ... in diesem Fall Bootstrap- und Similer-Dateien, aber ich möchte ein Sicherheitsnetz in Form eines Rückrufs bereitstellen, falls das CDN aus irgendeinem Grund nicht verfügbar ist ...

Ich würde etwas Code hinzufügen, aber ich weiß wirklich nicht, wie ich das überhaupt angehen soll ...

Hier ist ein Beispiel für ein reguläres wp_enqueue_script, das ich derzeit verwende:

wp_enqueue_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true);
6
Sagive SEO

Die akzeptierte Antwort ist völlig falsch. Ich vermute ein grobes Missverständnis der Frage des OP, da jeder, der auch nur ein wenig Erfahrung mit Programmierung hat, niemals so etwas wie "Zwischenspeichern Ihrer eigenen Kopie des Skripts und Ausführen von get_url-Aufrufen alle 20 Minuten" empfehlen wird.

@ Paul G. sagt, dass es keinen Sinn macht, bei jedem Seitenaufruf vom CDN zu laden.

Das ist der springende Punkt bei der Verwendung von CDNs. Wenn Sie nicht vom CDN laden und stattdessen Ihre zwischengespeicherte Kopie laden, muss der Client sie von Ihrem Server herunterladen. Sie befinden sich möglicherweise in Auckland, Neuseeland, und Ihr Kunde befindet sich möglicherweise in London. Ihr Server wird niemals in der Lage sein, eine CDN zu finden, die sich näher am Client befindet.

Darüber hinaus verwenden CDNs Dinge wie NGINX/Varnish mit massiven Caches, die nicht einmal Server berühren. Ihr Server verwendet möglicherweise einen Reverse-Proxy wie NGINX mit Lastenausgleich. Er verfügt möglicherweise über einen großen Cache für statische Dateien. Um Ihre Kopie der Dateien zu laden, muss der gesamte Stapel durchsucht werden. Dies kann bei weitem nicht die Geschwindigkeit erreichen, die Sie beim Laden zwischengespeicherter statischer Dateien erreichen.

Was auch immer Sie tun, verwenden Sie CDNs so weit wie möglich und ja bei jedem Seitenaufruf.

Schließlich machst du dir Sorgen, dass ein CDN ausfällt. In diesem Fall können Sie einfach 2 oder 3 andere CDNs als Fallbacks angeben. Wenn das Laden des primären CDNs fehlschlägt, können Sie problemlos einen Listener anschließen und die anderen CDNs laden.

Für den Fall, dass alle wichtigen CDNs ausfallen, ist Ihre Website nicht die einzige auf der Welt, die nicht funktioniert. Sie können Dinge wie Facebook, Imgur, Flckr und eine Milliarde andere Websites hinzufügen, die bei Ihnen fehlschlagen. Zu diesem Zeitpunkt ist es möglicherweise besser, nach draußen zu gehen und in den Himmel zu schauen, und vielleicht finden Sie die UFOs, die den ersten weltweiten Ausfall eines Rechenzentrums in der Geschichte der Menschheit verursacht haben.

Kurze Antwort: Verwenden Sie die Cdn.

Beispiel erfordert das Skript für die Fallback-URLs.

   requirejs.config({
   enforceDefine: true,
   paths: {
       jquery: [
        '//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min',
        //If the CDN location fails, load from this location
        //xyz.com/jquery.min.js
      ]
   }
   });
6
user2076066

Ich habe den vorherigen Beitrag genommen und 2 Dinge damit gemacht:

  • verwendet native WordPress-HTTP-Aufruffunktionen
  • zwischenspeichern der Tatsache, dass der CDN für 20 Minuten aktiv ist (Sie können dies optimieren). Sie möchten den CDN-Inhalt wirklich nicht bei JEDEM Seitenaufruf erhalten. Es macht keinen Sinn, Ihre Site mit CDNs zu beschleunigen, wenn Sie dies tun.
$get_the_url = 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js';

$cdnIsUp = get_transient( 'cnd_is_up' );

if ( $cdnIsUp ) {

    $load_source = 'load_external_bootstrap';

} else {

    $cdn_response = wp_remote_get( $get_the_url );

    if( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code($cdn_response) != '200' ) {

        $load_source = 'load_local_bootstrap';

    }
    else {

        $cdnIsUp = set_transient( 'cnd_is_up', true, MINUTE_IN_SECONDS * 20 );
        $load_source = 'load_external_bootstrap';
    }
 }

add_action('wp_enqueue_scripts', $load_source );

function load_external_bootstrap() { 
    wp_register_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true); 
    wp_enqueue_script('bootstrap'); 
}

function load_local_bootstrap() {
    wp_register_script('bootstrap', get_bloginfo('template_url').'/js/bootstrap.min.js', __FILE__, array('jquery'), 3.3, true);
    wp_enqueue_script('bootstrap'); 
}
8
Paul G.

Sie können so etwas versuchen, um zuerst die CDN-Version zu testen und sie dann abhängig davon, ob sie verfügbar ist oder nicht, bedingt zu laden:

$get_the_url = 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js';
    $test_the_url = @fopen( $get_the_url,'r' );

    if ( $test_the_url !== false ) {

        function load_external_bootstrap() { 
        wp_register_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true); 
        wp_enqueue_script('bootstrap'); 

    }

    add_action('wp_enqueue_scripts', 'load_external_bootstrap');

    } else {

        function load_local_bootstrap() {
        wp_register_script('bootstrap', get_bloginfo('template_url').'/js/bootstrap.min.js', __FILE__, array('jquery'), 3.3, true);
        wp_enqueue_script('bootstrap'); 
    }

    add_action('wp_enqueue_scripts', 'load_local_bootstrap');
    }
2
Matt Royal

@ciro ist absolut richtig, dass die Verbindung zum Server kein geeigneter Test dafür ist. Der Zweck des Fallbacks besteht darin, sicherzustellen, dass dem Client das Dokument zugestellt werden kann.

In einigen Ländern ist Google blockiert (als Beispiel). Wenn sich Ihr Webserver in Kalifornien befindet, sich der Besucher jedoch in einem Land befindet, in dem Google blockiert ist, wird bei diesem serverseitigen Aufruf PHP TRUE getestet, das Skript wird jedoch nicht an den Benutzer weitergeleitet.

Unter So stellen Sie jQuery-Fallback in die Warteschlange - WordPress finden Sie eine Methode, die mit lokaler Sicherung in die Warteschlange gestellt wird und den Client und nicht den Server testet.

2
Mark

Ich habe mir zwei Wrapper-Funktionen ausgedacht:

function wp_enqueue_cdn_script( $handle, $src_cdn = false, $src_local = false, $deps = array(), $ver = false, $in_footer = false ) {
    $cdnIsUp = get_transient( $handle . '_script_cdn_is_up' );
    if ( $cdnIsUp ) {
        wp_enqueue_script( $handle, $src_cdn, $deps, $ver, $in_footer );
    } else {
        $cdn_response = wp_remote_get( $src_cdn );
        if ( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code( $cdn_response ) != '200' ) {
            wp_enqueue_script( $handle, $src_local, $deps, $ver, $in_footer );
        } else {
            $cdnIsUp = set_transient( $handle . '_script_cdn_is_up', true, MINUTE_IN_SECONDS * 20 );
            wp_enqueue_script( $handle, $src_cdn, $deps, $ver, $in_footer );
        }
    }
}

function wp_enqueue_cdn_style( $handle, $src_cdn = false, $src_local = false, $deps = array(), $ver = false, $media = 'all' ) {
    $cdnIsUp = get_transient( $handle . '_style_cdn_is_up' );
    if ( $cdnIsUp ) {
        wp_enqueue_style( $handle, $src_cdn, $deps, $ver, $media);
    } else {
        $cdn_response = wp_remote_get( $src_cdn );
        if ( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code( $cdn_response ) != '200' ) {
            wp_enqueue_style( $handle, $src_local, $deps, $ver, $media);
        } else {
            $cdnIsUp = set_transient( $handle . '_style_cdn_is_up', true, MINUTE_IN_SECONDS * 20 );
            wp_enqueue_style( $handle, $src_cdn, $deps, $ver, $media);
        }
    }
}

Aber ich frage mich, ob es wirklich hilfreich ist: Es überlastet den Server und wir geben vor, dass der Client es auch kann, wenn der Server das CDN erreicht, was in der realen Welt nicht immer der Fall ist.

2