Com base na resposta útil do @ kaiser, escrevi um código que parece funcionar bem. Essa é a razão pela qual eu o marquei como A resposta.
Deixe-me explicar minha solução ...
A lógica
Quando uma solicitação enviada pela API é executada WP_Http::request()
. Esse é o método com ...
@todo Refatore este código.
... no cabeçalho. Eu não poderia concordar mais.
Agora, existem alguns filtros. Decidi usar indevidamente pre_http_request
para minhas necessidades:
add_filter( 'pre_http_request', 't5_update_wp_per_https', 10, 3 );
Ficamos com três argumentos aqui: false, $r, $url
.
false
é o valor de retorno esperado para apply_filters()
. Se enviarmos mais alguma coisa de volta, o WordPress será interrompido imediatamente e a solicitação original não será enviada.
$r
é uma matriz de argumentos para essa solicitação. Temos que mudar isso também em um minuto.
$url
é - surpresa! - o URL.
Portanto, em nosso retorno de chamada t5_update_wp_per_https()
, examinamos a URL e, se for uma URL que queremos filtrar, dizemos NÃO ao WordPress por não dizer "não" ( false
).
Nota: A seguir, você pode impedir todas as solicitações HTTP com:
add_filter( 'pre_http_request', '__return_true' );
Em vez disso, acionamos nossa própria solicitação com uma URL melhor e argumentos ligeiramente ajustados ( $r
renomeados $args
para facilitar a leitura).
O código
Por favor, leia os comentários em linha, eles são importantes.
<?php
/**
* Plugin Name: T5 Update WP per HTTPS
* Description: Forces update checks and downloads for WP to use HTTPS.
* Plugin URI: http://wordpress.stackexchange.com/questions/72529/filter-any-http-request-uri
* Version: 2012.11.14
* Author: Thomas Scholz
* Author URI: http://toscho.de
* Licence: MIT
* License URI: http://opensource.org/licenses/MIT
*/
add_filter( 'pre_http_request', 't5_update_wp_per_https', 10, 3 );
/**
* Force HTTPS requests for update checks and new WP version downloads.
*
* @wp-hook pre_http_request
* @param bool $false
* @param array $args
* @param string $url
* @return FALSE|array|object FALSE if everything is okay, an array of request
* results or an WP_Error instance.
*/
function t5_update_wp_per_https( $false, $args, $url )
{
// Split the URL into useful parts.
$url_data = parse_url( $url );
// It is already HTTPS.
if ( 'https' === strtolower( $url_data['scheme'] ) )
return FALSE;
// Not our host.
if ( FALSE === stripos( $url_data['host'], 'wordpress.org' ) )
return FALSE;
// Make that an HTTPS request.
$new_url = substr_replace( $url, 'https', 0, 4 );
// WP_Http cannot verify the wordpress.org certificate.
$args['sslverify'] = FALSE;
// It is slow. We wait at least 30 seconds.
30 > $args['timeout'] and $args['timeout'] = 30;
// Get an instance of WP_Http.
$http = _wp_http_get_object();
// Get the result.
$result = $http->request( $new_url, $args );
/* prepend this line with a '#' to debug like a boss.
print '<pre>'
. htmlspecialchars( print_r( $result, TRUE ), ENT_QUOTES, 'utf-8', FALSE )
. '</pre>';
die();
/**/
return $result;
}
Os testes
Sem esse plugin, o WordPress usado:
http://api.wordpress.org/core/version-check/1.6/
para verificações de atualização e
http://wordpress.org/wordpress-3.4.2.zip
para baixar os novos arquivos.
Eu testei com duas instalações locais, um único site e uma organização multi-site no Win 7. Para forçar uma atualização do conjunto de I $wp_version
em wp-includes/version.php
para 1
ea versão do TwentyEleven para 1.3
.
Para assistir ao tráfego de rede, usei o Wireshark : é gratuito, roda em Windows e Linux e oferece algumas ferramentas de filtro impressionantes.
Observar HTTPS é um pouco difícil: você vê apenas dados criptografados ... essa é a ideia, afinal. Para ver se meu plug-in fez o que deveria, observei primeiro o tráfego não criptografado e observei o endereço IP usado para conectar ao wordpress.org. Isso foi 72.233.56.138
, às vezes 72.233.56.139
.
Não é de surpreender, há um balanceador de carga e provavelmente muitas outras ferramentas, portanto não podemos confiar em um endereço IP.
Então, digitei ip.addr == 72.233.56.138
a máscara de filtro, ativei o plug-in, fui wp-admin/update-core.php
e observei o tráfego no Wireshark. Linhas verdes são solicitações em texto simples - exatamente o que não queremos. As linhas vermelhas e pretas são um sinal de sucesso.
A verificação da atualização foi boa: encontrou as versões "mais recentes". As atualizações reais para o tema e o núcleo também foram boas. Exatamente o que eu precisava.
E ainda assim ... isso seria mais fácil se houvesse um filtro simples para o URL.