Dựa trên câu trả lời hữu ích của @ kaiser, tôi đã viết một số mã có vẻ hoạt động tốt. Đó là lý do tại sao tôi đánh dấu nó là Câu trả lời.
Hãy để tôi giải thích giải pháp của tôi
Hợp lý
Khi một yêu cầu được gửi qua API được thực hiện WP_Http::request()
. Đó là phương pháp với giáo dục
@todo Tái cấu trúc mã này.
Tiêu đề trong tiêu đề của nó. Tôi không thể đồng ý nhiều hơn.
Bây giờ, có một số bộ lọc. Tôi quyết định sử dụng sai pre_http_request
cho nhu cầu của mình:
add_filter( 'pre_http_request', 't5_update_wp_per_https', 10, 3 );
Chúng tôi nhận được ba đối số ở đây : false, $r, $url
.
false
là giá trị trả lại dự kiến cho apply_filters()
. Nếu chúng tôi gửi lại bất cứ điều gì khác, WordPress sẽ dừng ngay lập tức và yêu cầu ban đầu sẽ không được gửi.
$r
là một loạt các đối số cho yêu cầu đó. Chúng ta phải thay đổi những điều này quá trong một phút.
$url
là - bất ngờ! - URL.
Vì vậy, trong cuộc gọi lại của t5_update_wp_per_https()
chúng tôi, chúng tôi xem xét URL và nếu đó là một URL mà chúng tôi muốn lọc, chúng tôi nói KHÔNG với WordPress bằng cách không nói ra là không no false
.
Lưu ý bên lề: Theo sau bạn có thể ngăn chặn tất cả các yêu cầu HTTP với:
add_filter( 'pre_http_request', '__return_true' );
Thay vào đó, chúng tôi thực hiện yêu cầu của riêng mình bằng một URL tốt hơn và các đối số được điều chỉnh một chút ( $r
, được đổi tên thành để $args
dễ đọc).
Mật mã
Xin vui lòng đọc các ý kiến nội tuyến, chúng là quan trọng.
<?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;
}
Các bài kiểm tra
Không có plugin mà WordPress đã sử dụng:
http://api.wordpress.org/core/version-check/1.6/
để kiểm tra cập nhật và
http://wordpress.org/wordpress-3.4.2.zip
để tải về các tập tin mới.
Tôi đã thử nghiệm nó với hai bản cài đặt tại địa phương, một trang web duy nhất và một thiết lập nhiều trang web trên Win 7. Để buộc một bộ cập nhật tôi $wp_version
ở wp-includes/version.php
đến 1
và phiên bản của TwentyEleven tới 1.3
.
Để xem lưu lượng mạng tôi đã sử dụng Wireshark : Nó miễn phí, nó chạy trên Windows và Linux và nó cung cấp một số công cụ lọc ấn tượng.
Việc xem HTTPS hơi khó khăn một chút: Rốt cuộc bạn cũng chỉ thấy dữ liệu được mã hóa. Để xem plugin của tôi đã làm những gì cần làm, trước tiên tôi đã xem lưu lượng không được mã hóa và lưu ý địa chỉ IP được sử dụng để kết nối với wordpress.org. Đó là 72.233.56.138
, đôi khi 72.233.56.139
.
Không có gì đáng ngạc nhiên, có một bộ cân bằng tải và có lẽ nhiều công cụ khác, vì vậy chúng tôi không thể dựa vào một địa chỉ IP.
Sau đó, tôi gõ ip.addr == 72.233.56.138
vào mặt nạ bộ lọc, kích hoạt plugin, đi đến wp-admin/update-core.php
và xem lưu lượng trong Wireshark. Các dòng màu xanh lá cây là các yêu cầu trong văn bản thuần túy - chính xác là những gì chúng ta không muốn. Các đường màu đỏ và đen là một dấu hiệu của sự thành công.
Việc kiểm tra cập nhật diễn ra tốt đẹp: Nó tìm thấy các phiên bản mới hơn của Wikipedia. Các cập nhật thực tế cho chủ đề và cốt lõi cũng đi tốt. Chính xác những gì tôi cần.
Và vẫn có thể dễ dàng hơn nếu có một bộ lọc đơn giản cho URL.