if ( $markup || $translate )
$plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate );
+ else
+ $plugin_data['AuthorName'] = $plugin_data['Author'];
return $plugin_data;
}
function _get_plugin_data_markup_translate($plugin_file, $plugin_data, $markup = true, $translate = true) {
- //Translate fields30
+ //Translate fields
if ( $translate && ! empty($plugin_data['TextDomain']) ) {
if ( ! empty( $plugin_data['DomainPath'] ) )
load_plugin_textdomain($plugin_data['TextDomain'], false, dirname($plugin_file). $plugin_data['DomainPath']);
$plugin_data[ $field ] = translate($plugin_data[ $field ], $plugin_data['TextDomain']);
}
+ $plugins_allowedtags = array(
+ 'a' => array( 'href' => array(), 'title' => array() ),
+ 'abbr' => array( 'title' => array() ),
+ 'acronym' => array( 'title' => array() ),
+ 'code' => array(),
+ 'em' => array(),
+ 'strong' => array(),
+ );
+
+ $plugin_data['AuthorName'] = $plugin_data['Author'] = wp_kses( $plugin_data['Author'], $plugins_allowedtags );
+
//Apply Markup
if ( $markup ) {
if ( ! empty($plugin_data['PluginURI']) && ! empty($plugin_data['Name']) )
- $plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . __( 'Visit plugin homepage' ) . '">' . $plugin_data['Name'] . '</a>';
+ $plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . esc_attr__( 'Visit plugin homepage' ) . '">' . $plugin_data['Name'] . '</a>';
else
$plugin_data['Title'] = $plugin_data['Name'];
if ( ! empty($plugin_data['AuthorURI']) && ! empty($plugin_data['Author']) )
- $plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . __( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';
+ $plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . esc_attr__( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';
$plugin_data['Description'] = wptexturize( $plugin_data['Description'] );
if ( ! empty($plugin_data['Author']) )
$plugin_data['Description'] .= ' <cite>' . sprintf( __('By %s'), $plugin_data['Author'] ) . '.</cite>';
}
- $plugins_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());
-
- // Sanitize all displayed data
- $plugin_data['Title'] = wp_kses($plugin_data['Title'], $plugins_allowedtags);
- $plugin_data['Version'] = wp_kses($plugin_data['Version'], $plugins_allowedtags);
- $plugin_data['Description'] = wp_kses($plugin_data['Description'], $plugins_allowedtags);
- $plugin_data['Author'] = wp_kses($plugin_data['Author'], $plugins_allowedtags);
+ // Sanitize all displayed data. Author and AuthorName sanitized above.
+ $plugin_data['Title'] = wp_kses( $plugin_data['Title'], $plugins_allowedtags );
+ $plugin_data['Version'] = wp_kses( $plugin_data['Version'], $plugins_allowedtags );
+ $plugin_data['Description'] = wp_kses( $plugin_data['Description'], $plugins_allowedtags );
+ $plugin_data['Name'] = wp_kses( $plugin_data['Name'], $plugins_allowedtags );
return $plugin_data;
}
* be split for maintainability. Keep everything in one file for extreme
* optimization purposes.
*
- * @since unknown
+ * @since 1.5.0
*
* @param string $plugin_folder Optional. Relative path to single plugin folder.
* @return array Key is the plugin file path and the value is an array of the plugin data.
if ( substr($subfile, -4) == '.php' )
$plugin_files[] = "$file/$subfile";
}
+ closedir( $plugins_subdir );
}
} else {
if ( substr($file, -4) == '.php' )
$plugin_files[] = $file;
}
}
- } else {
- return $wp_plugins;
+ closedir( $plugins_dir );
}
- @closedir( $plugins_dir );
- @closedir( $plugins_subdir );
-
if ( empty($plugin_files) )
return $wp_plugins;
$wp_plugins[plugin_basename( $plugin_file )] = $plugin_data;
}
- uasort( $wp_plugins, create_function( '$a, $b', 'return strnatcasecmp( $a["Name"], $b["Name"] );' ));
+ uasort( $wp_plugins, '_sort_uname_callback' );
$cache_plugins[ $plugin_folder ] = $wp_plugins;
wp_cache_set('plugins', $cache_plugins, 'plugins');
if ( isset( $wp_plugins['index.php'] ) && filesize( WPMU_PLUGIN_DIR . '/index.php') <= 30 ) // silence is golden
unset( $wp_plugins['index.php'] );
- uasort( $wp_plugins, create_function( '$a, $b', 'return strnatcasecmp( $a["Name"], $b["Name"] );' ));
+ uasort( $wp_plugins, '_sort_uname_callback' );
return $wp_plugins;
}
+/**
+ * Callback to sort array by a 'Name' key.
+ *
+ * @since 3.1.0
+ * @access private
+ */
+function _sort_uname_callback( $a, $b ) {
+ return strnatcasecmp( $a['Name'], $b['Name'] );
+}
+
/**
* Check the wp-content directory and retrieve all drop-ins with any plugin data.
*
$dropins[ $plugin_file ] = $plugin_data;
}
- uksort( $dropins, create_function( '$a, $b', 'return strnatcasecmp( $a, $b );' ));
+ uksort( $dropins, 'strnatcasecmp' );
return $dropins;
}
return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
+/**
+ * Check whether the plugin is inactive.
+ *
+ * Reverse of is_plugin_active(). Used as a callback.
+ *
+ * @since 3.1.0
+ * @see is_plugin_active()
+ *
+ * @param string $plugin Base plugin path from plugins directory.
+ * @return bool True if inactive. False if active.
+ */
+function is_plugin_inactive( $plugin ) {
+ return ! is_plugin_active( $plugin );
+}
+
/**
* Check whether the plugin is active for the entire network.
*
*
* @since 3.0.0
*
- * @param $file Plugin to check
- * $return bool True if plugin is network only, false otherwise.
+ * @param string $plugin Plugin to check
+ * @return bool True if plugin is network only, false otherwise.
*/
function is_network_only_plugin( $plugin ) {
$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
* If any errors are found or text is outputted, then it will be captured to
* ensure that the success redirection will update the error redirection.
*
- * @since unknown
+ * @since 2.5.0
*
* @param string $plugin Plugin path to main plugin file with plugin data.
* @param string $redirect Optional. URL to redirect to.
- * @param bool $network_wide Whether to enable the plugin for all sites in the network or just the current site. Multisite only. Default is false.
+ * @param bool $network_wide Whether to enable the plugin for all sites in the
+ * network or just the current site. Multisite only. Default is false.
+ * @param bool $silent Prevent calling activation hooks. Optional, default is false.
* @return WP_Error|null WP_Error on invalid file or null on success.
*/
-function activate_plugin( $plugin, $redirect = '', $network_wide = false) {
- $plugin = plugin_basename( trim( $plugin ) );
+function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
+ $plugin = plugin_basename( trim( $plugin ) );
if ( is_multisite() && ( $network_wide || is_network_only_plugin($plugin) ) ) {
$network_wide = true;
if ( !empty($redirect) )
wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); // we'll override this later if the plugin can be included without fatal error
ob_start();
- include(WP_PLUGIN_DIR . '/' . $plugin);
- do_action( 'activate_plugin', trim( $plugin) );
+ include_once(WP_PLUGIN_DIR . '/' . $plugin);
+
+ if ( ! $silent ) {
+ do_action( 'activate_plugin', $plugin, $network_wide );
+ do_action( 'activate_' . $plugin, $network_wide );
+ }
+
if ( $network_wide ) {
$current[$plugin] = time();
update_site_option( 'active_sitewide_plugins', $current );
sort($current);
update_option('active_plugins', $current);
}
- do_action( 'activate_' . trim( $plugin ) );
- do_action( 'activated_plugin', trim( $plugin) );
+
+ if ( ! $silent ) {
+ do_action( 'activated_plugin', $plugin, $network_wide );
+ }
+
if ( ob_get_length() > 0 ) {
$output = ob_get_clean();
return new WP_Error('unexpected_output', __('The plugin generated unexpected output.'), $output);
* The deactivation hook is disabled by the plugin upgrader by using the $silent
* parameter.
*
- * @since unknown
+ * @since 2.5.0
*
* @param string|array $plugins Single plugin or list of plugins to deactivate.
- * @param bool $silent Optional, default is false. Prevent calling deactivate hook.
+ * @param bool $silent Prevent calling deactivation hooks. Default is false.
*/
function deactivate_plugins( $plugins, $silent = false ) {
- $network_current = get_site_option( 'active_sitewide_plugins', array() );
+ if ( is_multisite() )
+ $network_current = get_site_option( 'active_sitewide_plugins', array() );
$current = get_option( 'active_plugins', array() );
$do_blog = $do_network = false;
foreach ( (array) $plugins as $plugin ) {
- $plugin = plugin_basename($plugin);
+ $plugin = plugin_basename( trim( $plugin ) );
if ( ! is_plugin_active($plugin) )
continue;
+
+ $network_wide = is_plugin_active_for_network( $plugin );
+
if ( ! $silent )
- do_action( 'deactivate_plugin', trim( $plugin ) );
+ do_action( 'deactivate_plugin', $plugin, $network_wide );
- if ( is_plugin_active_for_network($plugin) ) {
- // Deactivate network wide
+ if ( $network_wide ) {
$do_network = true;
unset( $network_current[ $plugin ] );
} else {
- // Deactivate for this blog only
- $key = array_search( $plugin, (array) $current );
+ $key = array_search( $plugin, $current );
if ( false !== $key ) {
$do_blog = true;
array_splice( $current, $key, 1 );
}
}
- //Used by Plugin updater to internally deactivate plugin, however, not to notify plugins of the fact to prevent plugin output.
if ( ! $silent ) {
- do_action( 'deactivate_' . trim( $plugin ) );
- do_action( 'deactivated_plugin', trim( $plugin ) );
+ do_action( 'deactivate_' . $plugin, $network_wide );
+ do_action( 'deactivated_plugin', $plugin, $network_wide );
}
}
*
* The execution will be halted as soon as one of the plugins has an error.
*
- * @since unknown
+ * @since 2.6.0
*
* @param string|array $plugins
* @param string $redirect Redirect to page after successful activation.
* @param bool $network_wide Whether to enable the plugin for all sites in the network.
+ * @param bool $silent Prevent calling activation hooks. Default is false.
* @return bool|WP_Error True when finished or WP_Error if there were errors during a plugin activation.
*/
-function activate_plugins($plugins, $redirect = '', $network_wide) {
+function activate_plugins( $plugins, $redirect = '', $network_wide = false, $silent = false ) {
if ( !is_array($plugins) )
$plugins = array($plugins);
$errors = array();
- foreach ( (array) $plugins as $plugin ) {
+ foreach ( $plugins as $plugin ) {
if ( !empty($redirect) )
$redirect = add_query_arg('plugin', $plugin, $redirect);
- $result = activate_plugin($plugin, $redirect, $network_wide);
+ $result = activate_plugin($plugin, $redirect, $network_wide, $silent);
if ( is_wp_error($result) )
$errors[$plugin] = $result;
}
* If the plugins parameter list is empty, false will be returned. True when
* completed.
*
- * @since unknown
+ * @since 2.6.0
*
* @param array $plugins List of plugin
* @param string $redirect Redirect to page when complete.
$checked[] = 'checked[]=' . $plugin;
ob_start();
- $url = wp_nonce_url('plugins.php?action=delete-selected&verify-delete=1&' . implode('&', $checked), 'bulk-manage-plugins');
+ $url = wp_nonce_url('plugins.php?action=delete-selected&verify-delete=1&' . implode('&', $checked), 'bulk-plugins');
if ( false === ($credentials = request_filesystem_credentials($url)) ) {
$data = ob_get_contents();
ob_end_clean();
$this_plugin_dir = trailingslashit( dirname($plugins_dir . $plugin_file) );
// If plugin is in its own directory, recursively delete the directory.
- if ( strpos($plugin_file, '/') && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory seperator AND that its not the root plugin folder
+ if ( strpos($plugin_file, '/') && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory separator AND that its not the root plugin folder
$deleted = $wp_filesystem->delete($this_plugin_dir, true);
else
$deleted = $wp_filesystem->delete($plugins_dir . $plugin_file);
* Validate all active plugins, deactivates invalid and
* returns an array of deactivated ones.
*
- * @since unknown
+ * @since 2.5.0
* @return array invalid plugins, plugin as key, error as value
*/
function validate_active_plugins() {
*
* Checks that the file exists and {@link validate_file() is valid file}.
*
- * @since unknown
+ * @since 2.5.0
*
* @param string $plugin Plugin Path
* @return WP_Error|int 0 on success, WP_Error on failure.
* @param callback $function The function to be called to output the content for this page.
* @param string $icon_url The url to the icon to be used for this menu
* @param int $position The position in the menu order this one should appear
+ *
+ * @return string The resulting page's hook_suffix
*/
function add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '', $position = NULL ) {
global $menu, $admin_page_hooks, $_registered_pages, $_parent_pages;
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
* @param string $icon_url The url to the icon to be used for this menu
+ *
+ * @return string The resulting page's hook_suffix
*/
function add_object_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '') {
global $_wp_last_object_menu;
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
* @param string $icon_url The url to the icon to be used for this menu
+ *
+ * @return string The resulting page's hook_suffix
*/
function add_utility_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '') {
global $_wp_last_utility_menu;
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
global $submenu;
/**
* Add sub menu page to the tools main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'tools.php', $page_title, $menu_title, $capability, $menu_slug, $function );
/**
* Add sub menu page to the options main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'options-general.php', $page_title, $menu_title, $capability, $menu_slug, $function );
/**
* Add sub menu page to the themes main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'themes.php', $page_title, $menu_title, $capability, $menu_slug, $function );
/**
* Add sub menu page to the plugins main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'plugins.php', $page_title, $menu_title, $capability, $menu_slug, $function );
/**
* Add sub menu page to the Users/Profile main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
if ( current_user_can('edit_users') )
}
/**
* Add sub menu page to the Dashboard main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'index.php', $page_title, $menu_title, $capability, $menu_slug, $function );
/**
* Add sub menu page to the posts main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'edit.php', $page_title, $menu_title, $capability, $menu_slug, $function );
/**
* Add sub menu page to the media main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'upload.php', $page_title, $menu_title, $capability, $menu_slug, $function );
/**
* Add sub menu page to the links main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function add_links_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $function );
/**
* Add sub menu page to the pages main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
- */
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
+*/
function add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $function );
}
/**
* Add sub menu page to the comments main menu.
-*
+ *
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* @param string $capability The capability required for this menu to be displayed to the user.
* @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)
* @param callback $function The function to be called to output the content for this page.
- */
+ *
+ * @return string|bool The resulting page's hook_suffix, or false if the user does not have the capability required.
+*/
function add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {
return add_submenu_page( 'edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $function );
}
+
+/**
+ * Remove a top level admin menu
+ *
+ * @since 3.1.0
+ *
+ * @param string $menu_slug The slug of the menu
+ * @return array|bool The removed menu on success, False if not found
+ */
+function remove_menu_page( $menu_slug ) {
+ global $menu;
+
+ foreach ( $menu as $i => $item ) {
+ if ( $menu_slug == $item[2] ) {
+ unset( $menu[$i] );
+ return $item;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Remove an admin submenu
+ *
+ * @since 3.1.0
+ *
+ * @param string $menu_slug The slug for the parent menu
+ * @param string $submenu_slug The slug of the submenu
+ * @return array|bool The removed submenu on success, False if not found
+ */
+function remove_submenu_page( $menu_slug, $submenu_slug ) {
+ global $submenu;
+
+ if ( !isset( $submenu[$menu_slug] ) )
+ return false;
+
+ foreach ( $submenu[$menu_slug] as $i => $item ) {
+ if ( $submenu_slug == $item[2] ) {
+ unset( $submenu[$menu_slug][$i] );
+ return $item;
+ }
+ }
+
+ return false;
+}
+
/**
* Get the url to access a particular menu page based on the slug it was registered with.
*
global $_parent_pages;
if ( isset( $_parent_pages[$menu_slug] ) ) {
- if ( $_parent_pages[$menu_slug] ) {
- $url = admin_url( add_query_arg( 'page', $menu_slug, $_parent_pages[$menu_slug] ) );
+ $parent_slug = $_parent_pages[$menu_slug];
+ if ( $parent_slug && ! isset( $_parent_pages[$parent_slug] ) ) {
+ $url = admin_url( add_query_arg( 'page', $menu_slug, $parent_slug ) );
} else {
- $url = admin_url('admin.php?page=' . $menu_slug);
+ $url = admin_url( 'admin.php?page=' . $menu_slug );
}
} else {
$url = '';
/**
* {@internal Missing Short Description}}
*
- * @since unknown
+ * @since 2.7.0
*
* @param unknown_type $options
* @return unknown
/**
* {@internal Missing Short Description}}
*
- * @since unknown
+ * @since 2.7.0
*
* @param unknown_type $new_options
* @param unknown_type $options
/**
* {@internal Missing Short Description}}
*
- * @since unknown
+ * @since 2.7.0
*
* @param unknown_type $del_options
* @param unknown_type $options