Title: Plugin_Installer_Skin::do_overwrite
Published: August 11, 2020
Last modified: August 20, 2026

---

# Plugin_Installer_Skin::do_overwrite(): bool

## In this article

 * [Return](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#wp--skip-link--target)

This function’s access is marked private. This means it is not intended for use 
by plugin or theme developers, only by core. It is listed here for completeness.

Checks if the plugin can be overwritten and outputs the HTML for overwriting a plugin
on upload.

## 󠀁[Return](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#return)󠁿

 bool Whether the plugin can be overwritten and HTML was outputted.

## 󠀁[Source](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#source)󠁿

    ```php
    private function do_overwrite() {
    	if ( 'upload' !== $this->type || ! is_wp_error( $this->result ) || 'folder_exists' !== $this->result->get_error_code() ) {
    		return false;
    	}

    	$folder = $this->result->get_error_data( 'folder_exists' );
    	$folder = ltrim( substr( $folder, strlen( WP_PLUGIN_DIR ) ), '/' );

    	$current_plugin_data = false;
    	$all_plugins         = get_plugins();

    	foreach ( $all_plugins as $plugin => $plugin_data ) {
    		if ( strrpos( $plugin, $folder ) !== 0 ) {
    			continue;
    		}

    		$current_plugin_data = $plugin_data;
    	}

    	$new_plugin_data = $this->upgrader->new_plugin_data;

    	if ( ! $current_plugin_data || ! $new_plugin_data ) {
    		return false;
    	}

    	echo '<h2 class="update-from-upload-heading">' . esc_html__( 'This plugin is already installed.' ) . '</h2>';

    	$this->is_downgrading = version_compare( $current_plugin_data['Version'], $new_plugin_data['Version'], '>' );

    	$rows = array(
    		'Name'        => __( 'Plugin name' ),
    		'Version'     => __( 'Version' ),
    		'Author'      => __( 'Author' ),
    		'RequiresWP'  => __( 'Required WordPress version' ),
    		'RequiresPHP' => __( 'Required PHP version' ),
    	);

    	$table  = '<table class="update-from-upload-comparison"><tbody>';
    	$table .= '<tr><th></th><th>' . esc_html_x( 'Current', 'plugin' ) . '</th>';
    	$table .= '<th>' . esc_html_x( 'Uploaded', 'plugin' ) . '</th></tr>';

    	$is_same_plugin = true; // Let's consider only these rows.

    	foreach ( $rows as $field => $label ) {
    		$old_value = ! empty( $current_plugin_data[ $field ] ) ? (string) $current_plugin_data[ $field ] : '-';
    		$new_value = ! empty( $new_plugin_data[ $field ] ) ? (string) $new_plugin_data[ $field ] : '-';

    		$is_same_plugin = $is_same_plugin && ( $old_value === $new_value );

    		$diff_field   = ( 'Version' !== $field && $new_value !== $old_value );
    		$diff_version = ( 'Version' === $field && $this->is_downgrading );

    		$table .= '<tr><td class="name-label">' . $label . '</td><td>' . wp_strip_all_tags( $old_value ) . '</td>';
    		$table .= ( $diff_field || $diff_version ) ? '<td class="warning">' : '<td>';
    		$table .= wp_strip_all_tags( $new_value ) . '</td></tr>';
    	}

    	$table .= '</tbody></table>';

    	/**
    	 * Filters the compare table output for overwriting a plugin package on upload.
    	 *
    	 * @since 5.5.0
    	 *
    	 * @param string $table               The output table with Name, Version, Author, RequiresWP, and RequiresPHP info.
    	 * @param array  $current_plugin_data Array with current plugin data.
    	 * @param array  $new_plugin_data     Array with uploaded plugin data.
    	 */
    	echo apply_filters( 'install_plugin_overwrite_comparison', $table, $current_plugin_data, $new_plugin_data );

    	$install_actions = array();
    	$can_update      = true;

    	$blocked_message  = '<p>' . esc_html__( 'The plugin cannot be updated due to the following:' ) . '</p>';
    	$blocked_message .= '<ul class="ul-disc">';

    	$requires_php = $new_plugin_data['RequiresPHP'] ?? null;
    	$requires_wp  = $new_plugin_data['RequiresWP'] ?? null;

    	if ( ! is_php_version_compatible( $requires_php ) ) {
    		$error = sprintf(
    			/* translators: 1: Current PHP version, 2: Version required by the uploaded plugin. */
    			__( 'The PHP version on your server is %1$s, however the uploaded plugin requires %2$s.' ),
    			PHP_VERSION,
    			$requires_php
    		);

    		$blocked_message .= '<li>' . esc_html( $error ) . '</li>';
    		$can_update       = false;
    	}

    	if ( ! is_wp_version_compatible( $requires_wp ) ) {
    		$error = sprintf(
    			/* translators: 1: Current WordPress version, 2: Version required by the uploaded plugin. */
    			__( 'Your WordPress version is %1$s, however the uploaded plugin requires %2$s.' ),
    			esc_html( wp_get_wp_version() ),
    			$requires_wp
    		);

    		$blocked_message .= '<li>' . esc_html( $error ) . '</li>';
    		$can_update       = false;
    	}

    	$blocked_message .= '</ul>';

    	if ( $can_update ) {
    		if ( $this->is_downgrading ) {
    			$warning = sprintf(
    				/* translators: %s: Documentation URL. */
    				__( 'You are uploading an older version of a current plugin. You can continue to install the older version, but be sure to <a href="%s">back up your database and files</a> first.' ),
    				__( 'https://developer.wordpress.org/advanced-administration/security/backup/' )
    			);
    		} else {
    			$warning = sprintf(
    				/* translators: %s: Documentation URL. */
    				__( 'You are updating a plugin. Be sure to <a href="%s">back up your database and files</a> first.' ),
    				__( 'https://developer.wordpress.org/advanced-administration/security/backup/' )
    			);
    		}

    		echo '<p class="update-from-upload-notice">' . $warning . '</p>';

    		$overwrite = $this->is_downgrading ? 'downgrade-plugin' : 'update-plugin';

    		$install_actions['overwrite_plugin'] = sprintf(
    			'<a class="button button-primary update-from-upload-overwrite" href="%s" target="_parent">%s</a>',
    			wp_nonce_url( add_query_arg( 'overwrite', $overwrite, $this->url ), 'plugin-upload' ),
    			_x( 'Replace current with uploaded', 'plugin' )
    		);
    	} else {
    		echo $blocked_message;
    	}

    	$cancel_url = add_query_arg( 'action', 'upload-plugin-cancel-overwrite', $this->url );

    	$install_actions['plugins_page'] = sprintf(
    		'<a class="button" href="%s">%s</a>',
    		wp_nonce_url( $cancel_url, 'plugin-upload-cancel-overwrite' ),
    		__( 'Cancel and go back' )
    	);

    	/**
    	 * Filters the list of action links available following a single plugin installation failure
    	 * when overwriting is allowed.
    	 *
    	 * @since 5.5.0
    	 *
    	 * @param string[] $install_actions Array of plugin action links.
    	 * @param object   $api             Object containing WordPress.org API plugin data.
    	 * @param array    $new_plugin_data Array with uploaded plugin data.
    	 */
    	$install_actions = apply_filters( 'install_plugin_overwrite_actions', $install_actions, $this->api, $new_plugin_data );

    	if ( ! empty( $install_actions ) ) {
    		printf(
    			'<p class="update-from-upload-expired hidden">%s</p>',
    			__( 'The uploaded file has expired. Please go back and upload it again.' )
    		);
    		echo '<p class="update-from-upload-actions">' . implode( ' ', (array) $install_actions ) . '</p>';
    	}

    	return true;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-admin/includes/class-plugin-installer-skin.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.1/src/wp-admin/includes/class-plugin-installer-skin.php#L192)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.1/src/wp-admin/includes/class-plugin-installer-skin.php#L192-L354)

## 󠀁[Hooks](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#hooks)󠁿

 [apply_filters( ‘install_plugin_overwrite_actions’, string[] $install_actions, object $api, array $new_plugin_data )](https://developer.wordpress.org/reference/hooks/install_plugin_overwrite_actions/)

Filters the list of action links available following a single plugin installation
failure when overwriting is allowed.

 [apply_filters( ‘install_plugin_overwrite_comparison’, string $table, array $current_plugin_data, array $new_plugin_data )](https://developer.wordpress.org/reference/hooks/install_plugin_overwrite_comparison/)

Filters the compare table output for overwriting a plugin package on upload.

## 󠀁[Related](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#related)󠁿

| Uses | Description | 
| [wp_get_wp_version()](https://developer.wordpress.org/reference/functions/wp_get_wp_version/)`wp-includes/functions.php` |

Returns the current WordPress version.

  | 
| [is_php_version_compatible()](https://developer.wordpress.org/reference/functions/is_php_version_compatible/)`wp-includes/functions.php` |

Checks compatibility with the current PHP version.

  | 
| [is_wp_version_compatible()](https://developer.wordpress.org/reference/functions/is_wp_version_compatible/)`wp-includes/functions.php` |

Checks compatibility with the current WordPress version.

  | 
| [get_plugins()](https://developer.wordpress.org/reference/functions/get_plugins/)`wp-admin/includes/plugin.php` |

Checks the plugins directory and retrieve all plugin files with plugin data.

  | 
| [esc_html__()](https://developer.wordpress.org/reference/functions/esc_html__/)`wp-includes/l10n.php` |

Retrieves the translation of $text and escapes it for safe use in HTML output.

  | 
| [esc_html_x()](https://developer.wordpress.org/reference/functions/esc_html_x/)`wp-includes/l10n.php` |

Translates string with gettext context, and escapes it for safe use in HTML output.

  | 
| [wp_strip_all_tags()](https://developer.wordpress.org/reference/functions/wp_strip_all_tags/)`wp-includes/formatting.php` |

Properly strips all HTML tags including ‘script’ and ‘style’.

  | 
| [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` |

Retrieves the translation of $text.

  | 
| [_x()](https://developer.wordpress.org/reference/functions/_x/)`wp-includes/l10n.php` |

Retrieves translated string with gettext context.

  | 
| [esc_html()](https://developer.wordpress.org/reference/functions/esc_html/)`wp-includes/formatting.php` |

Escaping for HTML blocks.

  | 
| [wp_nonce_url()](https://developer.wordpress.org/reference/functions/wp_nonce_url/)`wp-includes/functions.php` |

Retrieves URL with nonce added to URL query.

  | 
| [add_query_arg()](https://developer.wordpress.org/reference/functions/add_query_arg/)`wp-includes/functions.php` |

Retrieves a modified URL query string.

  | 
| [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to a filter hook.

  | 
| [is_wp_error()](https://developer.wordpress.org/reference/functions/is_wp_error/)`wp-includes/load.php` |

Checks whether the given variable is a WordPress Error.

  |

[Show 9 more](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#)

| Used by | Description | 
| [Plugin_Installer_Skin::after()](https://developer.wordpress.org/reference/classes/plugin_installer_skin/after/)`wp-admin/includes/class-plugin-installer-skin.php` |

Performs an action following a plugin install.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/plugin_installer_skin/do_overwrite/?output_format=md#changelog)󠁿

| Version | Description | 
| [5.5.0](https://developer.wordpress.org/reference/since/5.5.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fplugin_installer_skin%2Fdo_overwrite%2F)
before being able to contribute a note or feedback.