Adăugarea script-urilor în WordPress folosind CDN cu funcție de siguranță
Vreau să includ mai multe script-uri și stiluri de la un CDN remote... în acest caz fișiere bootstrap și similare, dar vreau să ofer o plasă de siguranță sub forma unui callback în cazul în care CDN-ul nu funcționează din anumite motive...
Aș adăuga niște cod, dar chiar nu știu cum să abordez acest lucru deloc...
Iată un exemplu de wp_enqueue_script obișnuit pe care îl folosesc în prezent:
wp_enqueue_script( 'bootstrap', 'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js', array('jquery'), 3.3, true);

Am luat postarea anterioară și am făcut 2 lucruri cu ea:
- folosește funcțiile native WordPress pentru apeluri HTTP
- stochează în cache starea CDN-ului pentru 20 de minute (poți ajusta această valoare). Nu ai nevoie să verifici CDN-ul la FIECARE încărcare de pagină. Nu are sens să accelerezi site-ul cu CDN-uri dacă faci asta.
$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, multe funcții pe care nu le știam ;) mulțumesc mult pentru ajutor ;)

De ce să nu verifici pur și simplu dacă wp_register_script
returnează false? Văd o problemă cu transient-ul tău setat la fiecare 20 de minute, în sensul că site-ul ar putea să nu încarce scriptul extern bootstrap pentru cel puțin 20 de minute, ceea ce înseamnă 20 de minute prea multe. Dacă verifici valoarea returnată de wp_register_script
pentru scriptul extern și dacă este false, înregistrezi scriptul local, este mult mai curat și nu există așteptare dacă CDN-ul cade.

Răspunsul acceptat este complet greșit. Bănuiesc o neînțelegere gravă a întrebării OP, deoarece oricine cu chiar și puțină experiență în programare nu va recomanda niciodată ceva de genul "cachéază-ți propria copie a scriptului și efectuează apeluri get_url la fiecare 20 de minute".
@Paul G. spune că nu are sens să încarci de pe CDN la fiecare încărcare de pagină.
Tocmai acesta este scopul utilizării CDN-urilor. Dacă nu încarci de pe CDN și în schimb încarci copia ta cache, clientul trebuie să o descarce de pe serverul tău. Tu poți fi în Auckland, Noua Zeelandă, iar clientul tău poate fi în Londra. Serverul tău nu va putea niciodată să concureze cu un CDN situat mai aproape de client.
Mai mult, CDN-urile folosesc tehnologii precum NGINX/Varnish, cu cache-uri masive care nici măcar nu ating serverele. Serverul tău poate sau nu să folosească un reverse proxy precum NGINX cu load balancing, poate sau nu să aibă un cache mare pentru servirea fișierelor statice, așa că pentru a încărca copia ta a fișierelor, va trebui să parcurgă întregul stack, care poate fi departe de viteza pe care o obții prin încărcarea fișierelor statice din cache.
Orice ai face, folosește CDN-uri cât mai mult posibil, și da, la fiecare încărcare de pagină.
În final, îți faci griji că un CDN ar putea cădea. Dacă se întâmplă asta, o soluție simplă ar fi să menționezi 2-3 alte CDN-uri ca backup, iar dacă CDN-ul principal nu reușește să se încarce, poți conecta cu ușurință un listener și să încarci de pe celelalte.
În cazul în care toate CDN-urile majore sunt down, site-ul tău nu va fi singurul din lume care nu funcționează, poți adăuga în listă site-uri precum Facebook, Imgur, Flickr și un miliard de alte site-uri care vor eșua împreună cu tine. În acel moment, poate ar fi mai bine să ieși afară și să te uiți la cer, poate vei vedea OZN-urile care au cauzat prima cădere mondială a datacenterelor din istoria omenirii.
Răspuns scurt: Folosește CDN-ul.
Exemplu de script requirejs pentru URL-uri alternative:
requirejs.config({
enforceDefine: true,
paths: {
jquery: [
'//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min',
//Dacă locația CDN eșuează, încarcă de aici
//xyz.com/jquery.min.js
]
}
});

poți oferi un script/funcție reală care să folosească un al doilea CDN în cazul în care cel principal nu funcționează?

da, cea mai simplă și eficientă metodă de a rezolva această problemă este să folosești requireJs. Are FUNCȚIONALITATE INTEGRATĂ pentru URL-uri de rezervă în cazul în care URL-urile principale nu se încarcă. Am editat răspunsul meu pentru a include scriptul. Te rog să marchezi acest răspuns ca fiind cel corect, cel pe care l-ai marcat va induce în eroare utilizatorii.

Puteți încerca ceva de genul acesta pentru a testa mai întâi versiunea CDN și apoi să încărcați condiționat în funcție de disponibilitate:
$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');
}

Am creat două funcții 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);
}
}
}
Dar mă întreb dacă sunt cu adevărat utile: supraîncarcă serverul și presupunem că dacă serverul poate accesa CDN-ul, atunci și clientul poate, ceea ce nu este întotdeauna adevărat în lumea reală.

@ciro are absolut dreptate cu privire la faptul că testarea conexiunii serverului nu este potrivită pentru acest caz. Scopul soluției de rezervă (fallback) este să ne asigurăm că clientul poate primi documentul.
Există țări în care Google este blocat (de exemplu). Dacă serverul tău web se află în California, dar vizitatorul este într-o țară unde Google este blocat, acest apel PHP pe partea de server va returna TRUE, dar scriptul nu va fi servit utilizatorului.
Consultați Cum să încărci jQuery ca soluție de rezervă - WordPress pentru o metodă care încarcă cu o copie locală de rezervă și testează clientul, nu serverul.
