Automatic_Upgrader_Skin
云策文档标注
概述
Automatic_Upgrader_Skin 是 WordPress 升级器的一个皮肤类,专为自动升级场景设计,不直接输出内容,而是捕获并存储所有输出供调用方处理(如记录、邮件发送或丢弃)。它继承自 WP_Upgrader_Skin,并提供了无界面交互的升级反馈机制。
关键要点
- 用于自动 WordPress 升级,所有输出被缓冲存储,不直接显示给用户。
- 核心方法包括 feedback() 存储升级消息、header() 创建输出缓冲区、footer() 处理缓冲内容、get_upgrade_messages() 获取消息、request_filesystem_credentials() 处理文件系统凭证请求。
- 消息处理支持基本 HTML 过滤,确保安全用于日志或邮件。
- 继承自 WP_Upgrader_Skin,与 Bulk_Upgrader_Skin 和 WP_Ajax_Upgrader_Skin 相关。
代码示例
class Automatic_Upgrader_Skin extends WP_Upgrader_Skin {
protected $messages = array();
public function request_filesystem_credentials( $error = false, $context = '', $allow_relaxed_file_ownership = false ) {
if ( $context ) {
$this->options['context'] = $context;
}
ob_start();
$result = parent::request_filesystem_credentials( $error, $context, $allow_relaxed_file_ownership );
ob_end_clean();
return $result;
}
public function get_upgrade_messages() {
return $this->messages;
}
public function feedback( $feedback, ...$args ) {
// 处理消息并存储到 $this->messages
$string = trim( $string );
$string = wp_kses( $string, array( 'a' => array( 'href' => true ), 'br' => true, 'em' => true, 'strong' => true ) );
$this->messages[] = $string;
}
public function header() {
ob_start();
}
public function footer() {
$output = ob_get_clean();
if ( ! empty( $output ) ) {
$this->feedback( $output );
}
}
}注意事项
- 在自动升级中,使用此类可避免输出干扰,适合后台任务或脚本调用。
- request_filesystem_credentials() 方法通过输出缓冲隐藏凭证表单,确保无界面输出。
- 消息存储为数组,调用方需通过 get_upgrade_messages() 获取并进一步处理。
原文内容
Upgrader Skin for Automatic WordPress Upgrades.
Description
This skin is designed to be used when no output is intended, all output is captured and stored for the caller to process and log/email/discard.
See also
Methods
| Name | Description |
|---|---|
| Automatic_Upgrader_Skin::feedback | Stores a message about the upgrade. |
| Automatic_Upgrader_Skin::footer | Retrieves the buffered content, deletes the buffer, and processes the output. |
| Automatic_Upgrader_Skin::get_upgrade_messages | Retrieves the upgrade messages. |
| Automatic_Upgrader_Skin::header | Creates a new output buffer. |
| Automatic_Upgrader_Skin::request_filesystem_credentials | Determines whether the upgrader needs FTP/SSH details in order to connect to the filesystem. |
Source
class Automatic_Upgrader_Skin extends WP_Upgrader_Skin {
protected $messages = array();
/**
* Determines whether the upgrader needs FTP/SSH details in order to connect
* to the filesystem.
*
* @since 3.7.0
* @since 4.6.0 The `$context` parameter default changed from `false` to an empty string.
*
* @see request_filesystem_credentials()
*
* @param bool|WP_Error $error Optional. Whether the current request has failed to connect,
* or an error object. Default false.
* @param string $context Optional. Full path to the directory that is tested
* for being writable. Default empty.
* @param bool $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable. Default false.
* @return bool True on success, false on failure.
*/
public function request_filesystem_credentials( $error = false, $context = '', $allow_relaxed_file_ownership = false ) {
if ( $context ) {
$this->options['context'] = $context;
}
/*
* TODO: Fix up request_filesystem_credentials(), or split it, to allow us to request a no-output version.
* This will output a credentials form in event of failure. We don't want that, so just hide with a buffer.
*/
ob_start();
$result = parent::request_filesystem_credentials( $error, $context, $allow_relaxed_file_ownership );
ob_end_clean();
return $result;
}
/**
* Retrieves the upgrade messages.
*
* @since 3.7.0
*
* @return string[] Messages during an upgrade.
*/
public function get_upgrade_messages() {
return $this->messages;
}
/**
* Stores a message about the upgrade.
*
* @since 3.7.0
* @since 5.9.0 Renamed `$data` to `$feedback` for PHP 8 named parameter support.
*
* @param string|array|WP_Error $feedback Message data.
* @param mixed ...$args Optional text replacements.
*/
public function feedback( $feedback, ...$args ) {
if ( is_wp_error( $feedback ) ) {
$string = $feedback->get_error_message();
} elseif ( is_array( $feedback ) ) {
return;
} else {
$string = $feedback;
}
if ( ! empty( $this->upgrader->strings[ $string ] ) ) {
$string = $this->upgrader->strings[ $string ];
}
if ( str_contains( $string, '%' ) ) {
if ( ! empty( $args ) ) {
$string = vsprintf( $string, $args );
}
}
$string = trim( $string );
// Only allow basic HTML in the messages, as it'll be used in emails/logs rather than direct browser output.
$string = wp_kses(
$string,
array(
'a' => array(
'href' => true,
),
'br' => true,
'em' => true,
'strong' => true,
)
);
if ( empty( $string ) ) {
return;
}
$this->messages[] = $string;
}
/**
* Creates a new output buffer.
*
* @since 3.7.0
*/
public function header() {
ob_start();
}
/**
* Retrieves the buffered content, deletes the buffer, and processes the output.
*
* @since 3.7.0
*/
public function footer() {
$output = ob_get_clean();
if ( ! empty( $output ) ) {
$this->feedback( $output );
}
}
}