类文档

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

Changelog

Version Description
4.6.0 Moved to its own file from wp-admin/includes/class-wp-upgrader-skins.php.
3.7.0 Introduced.