WP_SimplePie_File
云策文档标注
概述
WP_SimplePie_File 是 WordPress 核心类,用于通过 SimplePie 库获取远程文件和读取本地文件。它利用 WordPress 的 HTTP API 进行请求,允许插件通过 Hook 介入处理过程。
关键要点
- WP_SimplePie_File 继承自 SimplePieFile,主要用于处理文件获取,支持远程和本地文件。
- 使用 WordPress 的 HTTP API(如 wp_safe_remote_request)进行远程请求,确保安全性和可扩展性。
- 构造函数 __construct 接受多个参数,如 URL、超时时间、重定向次数、头部信息等,并处理响应头和错误。
- 从 WordPress 5.6.1 开始,多个头部信息被连接为逗号分隔的字符串,以兼容 SimplePie 的期望格式。
- 提供错误处理和状态码管理,便于开发者调试和集成。
代码示例
public function __construct( $url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false ) {
$this->url = $url;
$this->timeout = $timeout;
$this->redirects = $redirects;
$this->headers = $headers;
$this->useragent = $useragent;
$this->method = SimplePieSimplePie::FILE_SOURCE_REMOTE;
if ( preg_match( '/^http(s)?:///i', $url ) ) {
$args = array(
'timeout' => $this->timeout,
'redirection' => $this->redirects,
);
if ( ! empty( $this->headers ) ) {
$args['headers'] = $this->headers;
}
if ( SimplePieMisc::get_default_useragent() !== $this->useragent ) {
$args['user-agent'] = $this->useragent;
}
$res = wp_safe_remote_request( $url, $args );
if ( is_wp_error( $res ) ) {
$this->error = 'WP HTTP Error: ' . $res->get_error_message();
$this->success = false;
} else {
$this->headers = wp_remote_retrieve_headers( $res );
// 处理头部信息转换
$this->body = wp_remote_retrieve_body( $res );
$this->status_code = wp_remote_retrieve_response_code( $res );
}
} else {
$this->error = '';
$this->success = false;
}
}注意事项
- 在 WordPress 5.6.1 版本中,头部信息处理方式有更新,多个头部值被转换为逗号分隔字符串,但 content-type 头部例外,只使用最后一个值。
- 使用 wp_safe_remote_request 进行远程请求,确保遵循 WordPress 的安全最佳实践。
- 如果 URL 不是 HTTP/HTTPS 协议,构造函数会设置错误状态,开发者需注意处理非远程文件场景。
原文内容
Core class for fetching remote files and reading local files with SimplePie.
Description
This uses Core’s HTTP API to make requests, which gives plugins the ability to hook into the process.
Methods
| Name | Description |
|---|---|
| WP_SimplePie_File::__construct | Constructor. |
Source
class WP_SimplePie_File extends SimplePieFile {
/**
* Timeout.
*
* @var int How long the connection should stay open in seconds.
*/
public $timeout = 10;
/**
* Constructor.
*
* @since 2.8.0
* @since 3.2.0 Updated to use a PHP5 constructor.
* @since 5.6.1 Multiple headers are concatenated into a comma-separated string,
* rather than remaining an array.
*
* @param string $url Remote file URL.
* @param int $timeout Optional. How long the connection should stay open in seconds.
* Default 10.
* @param int $redirects Optional. The number of allowed redirects. Default 5.
* @param string|array $headers Optional. Array or string of headers to send with the request.
* Default null.
* @param string $useragent Optional. User-agent value sent. Default null.
* @param bool $force_fsockopen Optional. Whether to force opening internet or unix domain socket
* connection or not. Default false.
*/
public function __construct( $url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false ) {
$this->url = $url;
$this->timeout = $timeout;
$this->redirects = $redirects;
$this->headers = $headers;
$this->useragent = $useragent;
$this->method = SimplePieSimplePie::FILE_SOURCE_REMOTE;
if ( preg_match( '/^http(s)?:///i', $url ) ) {
$args = array(
'timeout' => $this->timeout,
'redirection' => $this->redirects,
);
if ( ! empty( $this->headers ) ) {
$args['headers'] = $this->headers;
}
if ( SimplePieMisc::get_default_useragent() !== $this->useragent ) { // Use default WP user agent unless custom has been specified.
$args['user-agent'] = $this->useragent;
}
$res = wp_safe_remote_request( $url, $args );
if ( is_wp_error( $res ) ) {
$this->error = 'WP HTTP Error: ' . $res->get_error_message();
$this->success = false;
} else {
$this->headers = wp_remote_retrieve_headers( $res );
if ( $this->headers instanceof WpOrgRequestsUtilityCaseInsensitiveDictionary ) {
$this->headers = $this->headers->getAll();
}
/*
* SimplePie expects multiple headers to be stored as a comma-separated string,
* but `wp_remote_retrieve_headers()` returns them as an array, so they need
* to be converted.
*
* The only exception to that is the `content-type` header, which should ignore
* any previous values and only use the last one.
*
* @see SimplePieHTTPParser::new_line().
*/
foreach ( $this->headers as $name => $value ) {
if ( ! is_array( $value ) ) {
continue;
}
if ( 'content-type' === $name ) {
$this->headers[ $name ] = array_pop( $value );
} else {
$this->headers[ $name ] = implode( ', ', $value );
}
}
$this->body = wp_remote_retrieve_body( $res );
$this->status_code = wp_remote_retrieve_response_code( $res );
}
} else {
$this->error = '';
$this->success = false;
}
}
}
Changelog
| Version | Description |
|---|---|
| 2.8.0 | Introduced. |