Title: install_plugin_information
Published: April 25, 2014
Last modified: February 24, 2026

---

# install_plugin_information()

## In this article

 * [Source](https://developer.wordpress.org/reference/functions/install_plugin_information/?output_format=md#source)
 * [Related](https://developer.wordpress.org/reference/functions/install_plugin_information/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/install_plugin_information/?output_format=md#changelog)

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

Displays plugin information in dialog box form.

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

    ```php
    function install_plugin_information() {
    	global $tab;

    	if ( empty( $_REQUEST['plugin'] ) ) {
    		return;
    	}

    	$api = plugins_api(
    		'plugin_information',
    		array(
    			'slug' => wp_unslash( $_REQUEST['plugin'] ),
    		)
    	);

    	if ( is_wp_error( $api ) ) {
    		wp_die( $api );
    	}

    	$plugins_allowedtags = array(
    		'a'          => array(
    			'href'   => array(),
    			'title'  => array(),
    			'target' => array(),
    		),
    		'abbr'       => array( 'title' => array() ),
    		'acronym'    => array( 'title' => array() ),
    		'code'       => array(),
    		'pre'        => array(),
    		'em'         => array(),
    		'strong'     => array(),
    		'div'        => array( 'class' => array() ),
    		'span'       => array( 'class' => array() ),
    		'p'          => array(),
    		'br'         => array(),
    		'ul'         => array(),
    		'ol'         => array(),
    		'li'         => array(),
    		'h1'         => array(),
    		'h2'         => array(),
    		'h3'         => array(),
    		'h4'         => array(),
    		'h5'         => array(),
    		'h6'         => array(),
    		'img'        => array(
    			'src'   => array(),
    			'class' => array(),
    			'alt'   => array(),
    		),
    		'blockquote' => array( 'cite' => true ),
    	);

    	$plugins_section_titles = array(
    		'description'  => _x( 'Description', 'Plugin installer section title' ),
    		'installation' => _x( 'Installation', 'Plugin installer section title' ),
    		'faq'          => _x( 'FAQ', 'Plugin installer section title' ),
    		'screenshots'  => _x( 'Screenshots', 'Plugin installer section title' ),
    		'changelog'    => _x( 'Changelog', 'Plugin installer section title' ),
    		'reviews'      => _x( 'Reviews', 'Plugin installer section title' ),
    		'other_notes'  => _x( 'Other Notes', 'Plugin installer section title' ),
    	);

    	// Sanitize HTML.
    	foreach ( (array) $api->sections as $section_name => $content ) {
    		$api->sections[ $section_name ] = wp_kses( $content, $plugins_allowedtags );
    	}

    	foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) {
    		if ( isset( $api->$key ) ) {
    			$api->$key = wp_kses( $api->$key, $plugins_allowedtags );
    		}
    	}

    	$_tab = esc_attr( $tab );

    	// Default to the Description tab, Do not translate, API returns English.
    	$section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description';
    	if ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) {
    		$section_titles = array_keys( (array) $api->sections );
    		$section        = reset( $section_titles );
    	}

    	iframe_header( __( 'Plugin Installation' ) );

    	$_with_banner = '';

    	if ( ! empty( $api->banners ) && ( ! empty( $api->banners['low'] ) || ! empty( $api->banners['high'] ) ) ) {
    		$_with_banner = 'with-banner';
    		$low          = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low'];
    		$high         = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high'];
    		?>
    		<style type="text/css">
    			#plugin-information-title.with-banner {
    				background-image: url( <?php echo esc_url( $low ); ?> );
    			}
    			@media only screen and ( -webkit-min-device-pixel-ratio: 1.5 ) {
    				#plugin-information-title.with-banner {
    					background-image: url( <?php echo esc_url( $high ); ?> );
    				}
    			}
    		</style>
    		<?php
    	}

    	echo '<div id="plugin-information-scrollable">';
    	echo "<div id='{$_tab}-title' class='{$_with_banner}'><div class='vignette'></div><h2>{$api->name}</h2></div>";
    	echo "<div id='{$_tab}-tabs' class='{$_with_banner}'>\n";

    	foreach ( (array) $api->sections as $section_name => $content ) {
    		if ( 'reviews' === $section_name && ( empty( $api->ratings ) || 0 === array_sum( (array) $api->ratings ) ) ) {
    			continue;
    		}

    		if ( isset( $plugins_section_titles[ $section_name ] ) ) {
    			$title = $plugins_section_titles[ $section_name ];
    		} else {
    			$title = ucwords( str_replace( '_', ' ', $section_name ) );
    		}

    		$class       = ( $section_name === $section ) ? ' class="current"' : '';
    		$href        = add_query_arg(
    			array(
    				'tab'     => $tab,
    				'section' => $section_name,
    			)
    		);
    		$href        = esc_url( $href );
    		$san_section = esc_attr( $section_name );
    		echo "\t<a name='$san_section' href='$href' $class>$title</a>\n";
    	}

    	echo "</div>\n";

    	?>
    <div id="<?php echo $_tab; ?>-content" class='<?php echo $_with_banner; ?>'>
    	<div class="fyi">
    		<ul>
    			<?php if ( ! empty( $api->version ) ) { ?>
    				<li><strong><?php _e( 'Version:' ); ?></strong> <?php echo $api->version; ?></li>
    			<?php } if ( ! empty( $api->author ) ) { ?>
    				<li><strong><?php _e( 'Author:' ); ?></strong> <?php echo links_add_target( $api->author, '_blank' ); ?></li>
    			<?php } if ( ! empty( $api->last_updated ) ) { ?>
    				<li><strong><?php _e( 'Last Updated:' ); ?></strong>
    					<?php
    					/* translators: %s: Human-readable time difference. */
    					printf( __( '%s ago' ), human_time_diff( strtotime( $api->last_updated ) ) );
    					?>
    				</li>
    			<?php } if ( ! empty( $api->requires ) ) { ?>
    				<li>
    					<strong><?php _e( 'Requires WordPress Version:' ); ?></strong>
    					<?php
    					/* translators: %s: Version number. */
    					printf( __( '%s or higher' ), $api->requires );
    					?>
    				</li>
    			<?php } if ( ! empty( $api->tested ) ) { ?>
    				<li><strong><?php _e( 'Compatible up to:' ); ?></strong> <?php echo $api->tested; ?></li>
    			<?php } if ( ! empty( $api->requires_php ) ) { ?>
    				<li>
    					<strong><?php _e( 'Requires PHP Version:' ); ?></strong>
    					<?php
    					/* translators: %s: Version number. */
    					printf( __( '%s or higher' ), $api->requires_php );
    					?>
    				</li>
    			<?php } if ( isset( $api->active_installs ) ) { ?>
    				<li><strong><?php _e( 'Active Installations:' ); ?></strong>
    				<?php
    				if ( $api->active_installs >= 1000000 ) {
    					$active_installs_millions = floor( $api->active_installs / 1000000 );
    					printf(
    						/* translators: %s: Number of millions. */
    						_nx( '%s+ Million', '%s+ Million', $active_installs_millions, 'Active plugin installations' ),
    						number_format_i18n( $active_installs_millions )
    					);
    				} elseif ( $api->active_installs < 10 ) {
    					_ex( 'Less Than 10', 'Active plugin installations' );
    				} else {
    					echo number_format_i18n( $api->active_installs ) . '+';
    				}
    				?>
    				</li>
    			<?php } if ( ! empty( $api->slug ) && empty( $api->external ) ) { ?>
    				<li><a target="_blank" href="<?php echo esc_url( __( 'https://wordpress.org/plugins/' ) . $api->slug ); ?>/"><?php _e( 'WordPress.org Plugin Page &#187;' ); ?></a></li>
    			<?php } if ( ! empty( $api->homepage ) ) { ?>
    				<li><a target="_blank" href="<?php echo esc_url( $api->homepage ); ?>"><?php _e( 'Plugin Homepage &#187;' ); ?></a></li>
    			<?php } if ( ! empty( $api->donate_link ) && empty( $api->contributors ) ) { ?>
    				<li><a target="_blank" href="<?php echo esc_url( $api->donate_link ); ?>"><?php _e( 'Donate to this plugin &#187;' ); ?></a></li>
    			<?php } ?>
    		</ul>
    		<?php if ( ! empty( $api->rating ) ) { ?>
    			<h3><?php _e( 'Average Rating' ); ?></h3>
    			<?php
    			wp_star_rating(
    				array(
    					'rating' => $api->rating,
    					'type'   => 'percent',
    					'number' => $api->num_ratings,
    				)
    			);
    			?>
    			<p aria-hidden="true" class="fyi-description">
    				<?php
    				printf(
    					/* translators: %s: Number of ratings. */
    					_n( '(based on %s rating)', '(based on %s ratings)', $api->num_ratings ),
    					number_format_i18n( $api->num_ratings )
    				);
    				?>
    			</p>
    			<?php
    		}

    		if ( ! empty( $api->ratings ) && array_sum( (array) $api->ratings ) > 0 ) {
    			?>
    			<h3><?php _e( 'Reviews' ); ?></h3>
    			<p class="fyi-description"><?php _e( 'Read all reviews on WordPress.org or write your own!' ); ?></p>
    			<?php
    			foreach ( $api->ratings as $key => $ratecount ) {
    				// Avoid div-by-zero.
    				$_rating    = $api->num_ratings ? ( $ratecount / $api->num_ratings ) : 0;
    				$aria_label = esc_attr(
    					sprintf(
    						/* translators: 1: Number of stars (used to determine singular/plural), 2: Number of reviews. */
    						_n(
    							'Reviews with %1$d star: %2$s. Opens in a new tab.',
    							'Reviews with %1$d stars: %2$s. Opens in a new tab.',
    							$key
    						),
    						$key,
    						number_format_i18n( $ratecount )
    					)
    				);
    				?>
    				<div class="counter-container">
    						<span class="counter-label">
    							<?php
    							printf(
    								'<a href="%s" target="_blank" aria-label="%s">%s</a>',
    								"https://wordpress.org/support/plugin/{$api->slug}/reviews/?filter={$key}",
    								$aria_label,
    								/* translators: %s: Number of stars. */
    								sprintf( _n( '%d star', '%d stars', $key ), $key )
    							);
    							?>
    						</span>
    						<span class="counter-back">
    							<span class="counter-bar" style="width: <?php echo 92 * $_rating; ?>px;"></span>
    						</span>
    					<span class="counter-count" aria-hidden="true"><?php echo number_format_i18n( $ratecount ); ?></span>
    				</div>
    				<?php
    			}
    		}
    		if ( ! empty( $api->contributors ) ) {
    			?>
    			<h3><?php _e( 'Contributors' ); ?></h3>
    			<ul class="contributors">
    				<?php
    				foreach ( (array) $api->contributors as $contrib_username => $contrib_details ) {
    					$contrib_name = $contrib_details['display_name'];
    					if ( ! $contrib_name ) {
    						$contrib_name = $contrib_username;
    					}
    					$contrib_name = esc_html( $contrib_name );

    					$contrib_profile = esc_url( $contrib_details['profile'] );
    					$contrib_avatar  = esc_url( add_query_arg( 's', '36', $contrib_details['avatar'] ) );

    					echo "<li><a href='{$contrib_profile}' target='_blank'><img src='{$contrib_avatar}' width='18' height='18' alt='' />{$contrib_name}</a></li>";
    				}
    				?>
    			</ul>
    					<?php if ( ! empty( $api->donate_link ) ) { ?>
    				<a target="_blank" href="<?php echo esc_url( $api->donate_link ); ?>"><?php _e( 'Donate to this plugin &#187;' ); ?></a>
    			<?php } ?>
    				<?php } ?>
    	</div>
    	<div id="section-holder">
    	<?php
    	$requires_php = isset( $api->requires_php ) ? $api->requires_php : null;
    	$requires_wp  = isset( $api->requires ) ? $api->requires : null;

    	$compatible_php = is_php_version_compatible( $requires_php );
    	$compatible_wp  = is_wp_version_compatible( $requires_wp );
    	$tested_wp      = ( empty( $api->tested ) || version_compare( get_bloginfo( 'version' ), $api->tested, '<=' ) );

    	if ( ! $compatible_php ) {
    		$compatible_php_notice_message  = '<p>';
    		$compatible_php_notice_message .= __( '<strong>Error:</strong> This plugin <strong>requires a newer version of PHP</strong>.' );

    		if ( current_user_can( 'update_php' ) ) {
    			$compatible_php_notice_message .= sprintf(
    				/* translators: %s: URL to Update PHP page. */
    				' ' . __( '<a href="%s" target="_blank">Click here to learn more about updating PHP</a>.' ),
    				esc_url( wp_get_update_php_url() )
    			) . wp_update_php_annotation( '</p><p><em>', '</em>', false );
    		} else {
    			$compatible_php_notice_message .= '</p>';
    		}

    		wp_admin_notice(
    			$compatible_php_notice_message,
    			array(
    				'type'               => 'error',
    				'additional_classes' => array( 'notice-alt' ),
    				'paragraph_wrap'     => false,
    			)
    		);
    	}

    	if ( ! $tested_wp ) {
    		wp_admin_notice(
    			__( '<strong>Warning:</strong> This plugin <strong>has not been tested</strong> with your current version of WordPress.' ),
    			array(
    				'type'               => 'warning',
    				'additional_classes' => array( 'notice-alt' ),
    			)
    		);
    	} elseif ( ! $compatible_wp ) {
    		$compatible_wp_notice_message = __( '<strong>Error:</strong> This plugin <strong>requires a newer version of WordPress</strong>.' );
    		if ( current_user_can( 'update_core' ) ) {
    			$compatible_wp_notice_message .= sprintf(
    				/* translators: %s: URL to WordPress Updates screen. */
    				' ' . __( '<a href="%s" target="_parent">Click here to update WordPress</a>.' ),
    				esc_url( self_admin_url( 'update-core.php' ) )
    			);
    		}

    		wp_admin_notice(
    			$compatible_wp_notice_message,
    			array(
    				'type'               => 'error',
    				'additional_classes' => array( 'notice-alt' ),
    			)
    		);
    	}

    	foreach ( (array) $api->sections as $section_name => $content ) {
    		$content = links_add_base_url( $content, 'https://wordpress.org/plugins/' . $api->slug . '/' );
    		$content = links_add_target( $content, '_blank' );

    		$san_section = esc_attr( $section_name );

    		$display = ( $section_name === $section ) ? 'block' : 'none';

    		echo "\t<div id='section-{$san_section}' class='section' style='display: {$display};'>\n";
    		echo $content;
    		echo "\t</div>\n";
    	}
    	echo "</div>\n";
    	echo "</div>\n";
    	echo "</div>\n"; // #plugin-information-scrollable
    	echo "<div id='$tab-footer'>\n";
    	if ( ! empty( $api->download_link ) && ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) ) {
    		$button = wp_get_plugin_action_button( $api->name, $api, $compatible_php, $compatible_wp );
    		$button = str_replace( 'class="', 'class="right ', $button );

    		if ( ! str_contains( $button, _x( 'Activate', 'plugin' ) ) ) {
    			$button = str_replace( 'class="', 'id="plugin_install_from_iframe" class="', $button );
    		}

    		echo wp_kses_post( $button );
    	}
    	echo "</div>\n";

    	wp_print_request_filesystem_credentials_modal();
    	wp_print_admin_notice_templates();

    	iframe_footer();
    	exit;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-admin/includes/plugin-install.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-admin/includes/plugin-install.php#L519)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-admin/includes/plugin-install.php#L519-L890)

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

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

Gets the markup for the plugin install action button.

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

Outputs an admin notice.

  | 
| [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.

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

Gets the URL to learn more about updating the PHP version the site is running on.

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

Prints the default annotation for the web host altering the “Update PHP” page URL.

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

Prints the JavaScript templates for update admin notices.

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

Prints the filesystem credentials modal when needed.

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

Retrieves plugin installer pages from the WordPress.org Plugins API.

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

Outputs a HTML element with a star rating for a given rating.

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

Generic Iframe header for use with Thickbox.

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

Generic Iframe footer for use with Thickbox.

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

Translates and retrieves the singular or plural form based on the supplied number, with gettext context.

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

Displays translated string with gettext context.

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

Translates and retrieves the singular or plural form based on the supplied number.

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

Adds a target attribute to all links in passed content.

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

Adds a base URL to relative links in passed content.

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

Determines the difference between two timestamps.

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

Sanitizes content for allowed HTML tags for post content.

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

Filters text content and strips out disallowed HTML.

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

Retrieves the URL to the admin area for either the current site or the network depending on context.

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

Returns whether the current user has the specified capability.

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

Retrieves translated string with gettext context.

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

Retrieves the translation of $text.

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

Displays translated text.

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

Removes slashes from a string or recursively removes slashes from strings within an array.

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

Escaping for HTML attributes.

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

Checks and cleans a URL.

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

Escaping for HTML blocks.

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

Retrieves information about the current site.

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

Kills WordPress execution and displays HTML page with an error message.

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

Retrieves a modified URL query string.

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

Converts float number to format based on the locale.

  | 
| [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 29 more](https://developer.wordpress.org/reference/functions/install_plugin_information/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/functions/install_plugin_information/?output_format=md#)

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

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

## User Contributed Notes

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