wp enqueue script usando scripts do cdn com retorno de segurança

Eu quero include vários scripts e estilos a partir de um CDN remoto … neste caso, arquivos bootstrap e similer, mas eu quero fornecer uma rede de segurança na forma de um retorno de chamada no caso de o CDN estar desativado por algum motivo …

Eu adicionaria algum código, mas eu realmente não sei como me aproxime disso …

Aqui está um exemplo de um wp_enqueue_script regular que uso atualmente:

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

Solutions Collecting From Web of "wp enqueue script usando scripts do cdn com retorno de segurança"

A resposta aceita é completamente errada. Eu suspeito de um grande mal entendido sobre a questão do OP, já que qualquer pessoa com até mesmo uma pequena experiência com a programação nunca recomendará algo como “armazenar em cache sua própria cópia do script e executar chamadas get_url a cada 20 minutos”.

@Paul G. diz que não há nenhum ponto em carregar a partir do CDN em cada carga de página.

Esse é o objective de usar o CDN’S. Se você não for carregado a partir do CDN e, em vez disso, carrega sua cópia em cache, o cliente precisa baixá-la do seu servidor. Você pode estar em Auckland Nova Zelândia e seu cliente pode estar em Londres. Seu servidor nunca poderá combinar um CDN localizado mais perto do cliente.

Além disso, os CDN’S usam coisas como NGINX / Verniz, com caches maciços que nem sequer tocam servidores. Seu servidor pode ou não estar usando um proxy reverso como o NGINX com balanceamento de carga, pode ou não ter um cache grande que serve arquivos estáticos, então, para carregar sua cópia dos arquivos, ele terá que passar por toda a pilha, que pode estar longe da velocidade que você obtém de carregar arquivos estáticos armazenados em cache.

Faça o que fizer, use CDN’S o mais longe possível e sim em cada carga de página.

Finalmente você está preocupado com um CDN descer. Se isso acontecer, uma solução simples seria mencionar 2 ou 3 outros CDN’S como backs, e se o CDN primário não for carregado, você poderia facilmente conectar um ouvinte e carregar dos outros.

No caso de todos os principais CDNs estarem para baixo, o seu não será o único site no mundo que não funciona, você pode adicionar coisas como Facebook, Imgur, Flckr e bilhões de outros sites que falharão com você. Naquele momento, talvez seja melhor sair e olhar para o céu, e talvez você encontre os OVNIs que causaram a primeira falha mundial de datacenter na história da humanidade.

Resposta curta: use o Cdn.

Exemplo de script requer para urls de retorno.

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

Eu peguei o post anterior e fiz 2 coisas com ele:

  • usa funções de chamada httpPress Word nativas
  • cache o fato de que o CDN está em espera há 20 minutos (você pode ajustar isso). Você realmente não deseja obter o conteúdo do CDN em CADA carga de página. Nenhum ponto em acelerar seu site com CDNs quando faz isso.

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

Você poderia tentar algo como isto para testar a versão CDN primeiro e depois carregar condicionalmente com base em se está disponível ou não:

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

Eu criei duas funções de 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); } } } 

Mas eu estou pensando se é realmente útil: ele sobrecarrega o servidor, e estamos fingindo que, se o servidor pode alcançar o CDN, o cliente também pode, o que nem sempre é verdadeiro no mundo real.

@ciro tem toda a razão sobre o servidor conectar não sendo um teste apropriado para isso. O ponto de retorno é garantir que o cliente possa ser servido no documento.

Existem países com o Google bloqueado (como exemplo). Se o seu servidor web estiver na Califórnia, mas o visitante estiver em um país onde o Google está bloqueado, essa chamada no lado do servidor PHP testará TRUE, mas o script não será servido ao usuário.

Veja Como enqueue jQuery fallback – WordPress para um método que envolve com backup local e testa o cliente não o servidor.