wp enqueue script utilizzando script da CDN con callback di sicurezza
Voglio includere diversi script e stili da un CDN remoto... in questo caso bootstrap e file simili, ma voglio fornire una rete di sicurezza sotto forma di callback nel caso in cui il CDN non sia disponibile per qualche motivo...
Aggiungerei del codice ma non so proprio come approcciare questo problema...
Ecco un esempio di wp_enqueue_script che uso attualmente:
wp_enqueue_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true);

Ho preso il post precedente e ho fatto 2 cose:
- utilizzato le funzioni native di WordPress per le chiamate HTTP
- memorizzato nella cache lo stato del CDN per 20 minuti (puoi modificare questo valore). Non vuoi davvero recuperare il contenuto dal CDN ad OGNI caricamento di pagina. Non ha senso velocizzare il tuo sito con i CDN se fai così.
$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');
}

wow, molte funzioni che non conoscevo ;) grazie mille per il tuo aiuto ;)

Perché non controllare semplicemente se wp_register_script
restituisce false? Vedo un problema con il tuo transient impostato ogni 20 minuti, nel senso che il sito potrebbe potenzialmente non caricare lo script bootstrap esterno per almeno 20 minuti, che sono 20 minuti troppi. Se controlli il valore restituito da wp_register_script
dello script esterno e se è false, registri lo script locale, è molto più pulito e non c'è attesa se il CDN va giù.

La risposta accettata è completamente sbagliata. Sospetto un grave fraintendimento della domanda dell'OP, poiché chiunque abbia anche solo un po' di esperienza con la programmazione non consiglierebbe mai qualcosa come "memorizza nella cache una tua copia dello script e esegui chiamate get_url ogni 20 minuti".
@Paul G. afferma che non ha senso caricare dal CDN ad ogni caricamento di pagina.
Questo è proprio il punto dell'utilizzo dei CDN.
Se non carichi dal CDN e invece carichi la tua copia memorizzata nella cache, il client deve scaricarla dal tuo server. Potresti essere ad Auckland in Nuova Zelanda e il tuo client potrebbe essere a Londra. Il tuo server non potrà mai competere con un CDN situato più vicino al client.
Inoltre, i CDN utilizzano tecnologie come NGINX/Varnish, con cache enormi che non toccano nemmeno i server. Il tuo server potrebbe o meno utilizzare un proxy inverso come NGINX con bilanciamento del carico, potrebbe o meno avere una cache ampia per servire file statici, quindi per caricare la tua copia dei file, dovrebbe attraversare l'intero stack, che potrebbe essere molto più lento rispetto al caricamento di file statici memorizzati nella cache.
Qualunque cosa tu faccia, utilizza i CDN il più possibile, e sì, ad ogni singolo caricamento di pagina.
Infine, sei preoccupato che un CDN possa andare giù. Se ciò accade, una semplice soluzione sarebbe menzionare 2 o 3 altri CDN come fallback, e se il CDN primario non riesce a caricare, potresti facilmente collegare un listener e caricare dagli altri.
Nel caso in cui tutti i principali CDN siano offline, il tuo non sarà l'unico sito al mondo a non funzionare, puoi aggiungere siti come Facebook, Imgur, Flickr e un miliardo di altri siti web che falliranno con te. A quel punto, potrebbe essere meglio uscire fuori e guardare il cielo, e forse troverai gli UFO che hanno causato il primo guasto mondiale dei datacenter nella storia dell'umanità.
Risposta breve:
Usa il CDN.
Esempio di script requirejs per URL di fallback.
requirejs.config({
enforceDefine: true,
paths: {
jquery: [
'//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min',
//Se la posizione del CDN fallisce, carica da questa posizione
//xyz.com/jquery.min.js
]
}
});

puoi fornire uno script/funzione effettivo che utilizzi un secondo CDN nel caso in cui quello principale non funzioni?

sì, il modo più semplice e migliore per gestirlo è usare requireJs. Ha FUNZIONALITÀ INTEGRATE per gli URL di fallback nel caso in cui gli URL primari non vengano caricati. Ho modificato la mia risposta per includere lo script. Per favore, segna questa come risposta corretta, quella che hai segnato potrebbe trarre in inganno gli utenti.

Potresti provare qualcosa del genere per testare prima la versione CDN e poi caricare condizionalmente in base alla sua disponibilità:
$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');
}

Ho creato due funzioni wrapper:
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);
}
}
}
Ma mi chiedo se sia veramente utile: sovraccarica il server, e stiamo assumendo che se il server può raggiungere il CDN anche il client possa farlo, cosa che non è sempre vera nel mondo reale.

@ciro ha assolutamente ragione riguardo al fatto che il test di connessione del server non sia appropriato in questo caso. Lo scopo del fallback è assicurarsi che il client possa ricevere il documento.
Ci sono paesi in cui Google è bloccato (ad esempio). Se il tuo server web è in California, ma il visitatore si trova in un paese dove Google è bloccato, questa chiamata PHP lato server restituirà TRUE, ma lo script non verrà servito all'utente.
Vedi Come accodare un fallback per jQuery - WordPress per un metodo che accoda con un backup locale e testa il client invece del server.
