File "plugin.php"
Full path: /home/kosmetik/public_html/wp-includes/wp-admin/includes/plugin.php
File
size: 42.75 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
function get_plugin_data($plugin_file, $markup = true, $translate = true)
{
$default_headers = array('Name' => 'Plugin Name', 'PluginURI' => 'Plugin URI', 'Version' => 'Version', 'Description' => 'Description', 'Author' => 'Author', 'AuthorURI' => 'Author URI', 'TextDomain' => 'Text Domain', 'DomainPath' => 'Domain Path', 'Network' => 'Network', 'RequiresWP' => 'Requires at least', 'RequiresPHP' => 'Requires PHP', '_sitewide' => 'Site Wide Only');
$plugin_data = get_file_data($plugin_file, $default_headers, 'plugin');
if (!$plugin_data['Network'] && $plugin_data['_sitewide']) {
_deprecated_argument(__FUNCTION__, '3.0.0', sprintf(__('The %1$s plugin header is deprecated. Use %2$s instead.'), '<code>Site Wide Only: true</code>', '<code>Network: true</code>'));
$plugin_data['Network'] = $plugin_data['_sitewide'];
}
$plugin_data['Network'] = 'true' === strtolower($plugin_data['Network']);
unset($plugin_data['_sitewide']);
if (!$plugin_data['TextDomain']) {
$plugin_slug = dirname(plugin_basename($plugin_file));
if ('.' !== $plugin_slug && false === strpos($plugin_slug, '/')) {
$plugin_data['TextDomain'] = $plugin_slug;
}
}
if ($markup || $translate) {
$plugin_data = _get_plugin_data_markup_translate($plugin_file, $plugin_data, $markup, $translate);
} else {
$plugin_data['Title'] = $plugin_data['Name'];
$plugin_data['AuthorName'] = $plugin_data['Author'];
}
return $plugin_data;
}
function _get_plugin_data_markup_translate($plugin_file, $plugin_data, $markup = true, $translate = true)
{
$plugin_file = plugin_basename($plugin_file);
if ($translate) {
$textdomain = $plugin_data['TextDomain'];
if ($textdomain) {
if (!is_textdomain_loaded($textdomain)) {
if ($plugin_data['DomainPath']) {
load_plugin_textdomain($textdomain, false, dirname($plugin_file) . $plugin_data['DomainPath']);
} else {
load_plugin_textdomain($textdomain, false, dirname($plugin_file));
}
}
} elseif ('hello.php' === basename($plugin_file)) {
$textdomain = 'default';
}
if ($textdomain) {
foreach (array('Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version') as $field) {
$plugin_data[$field] = translate($plugin_data[$field], $textdomain);
}
}
}
$allowed_tags_in_links = array('abbr' => array('title' => true), 'acronym' => array('title' => true), 'code' => true, 'em' => true, 'strong' => true);
$allowed_tags = $allowed_tags_in_links;
$allowed_tags['a'] = array('href' => true, 'title' => true);
$plugin_data['Name'] = wp_kses($plugin_data['Name'], $allowed_tags_in_links);
$plugin_data['Author'] = wp_kses($plugin_data['Author'], $allowed_tags);
$plugin_data['Description'] = wp_kses($plugin_data['Description'], $allowed_tags);
$plugin_data['Version'] = wp_kses($plugin_data['Version'], $allowed_tags);
$plugin_data['PluginURI'] = esc_url($plugin_data['PluginURI']);
$plugin_data['AuthorURI'] = esc_url($plugin_data['AuthorURI']);
$plugin_data['Title'] = $plugin_data['Name'];
$plugin_data['AuthorName'] = $plugin_data['Author'];
if ($markup) {
if ($plugin_data['PluginURI'] && $plugin_data['Name']) {
$plugin_data['Title'] = '<a href="' . $plugin_data['PluginURI'] . '">' . $plugin_data['Name'] . '</a>';
}
if ($plugin_data['AuthorURI'] && $plugin_data['Author']) {
$plugin_data['Author'] = '<a href="' . $plugin_data['AuthorURI'] . '">' . $plugin_data['Author'] . '</a>';
}
$plugin_data['Description'] = wptexturize($plugin_data['Description']);
if ($plugin_data['Author']) {
$plugin_data['Description'] .= sprintf(' <cite>' . __('By %s.') . '</cite>', $plugin_data['Author']);
}
}
return $plugin_data;
}
function get_plugin_files($plugin)
{
$plugin_file = WP_PLUGIN_DIR . '/' . $plugin;
$dir = dirname($plugin_file);
$plugin_files = array(plugin_basename($plugin_file));
if (is_dir($dir) && WP_PLUGIN_DIR !== $dir) {
$exclusions = (array) apply_filters('plugin_files_exclusions', array('CVS', 'node_modules', 'vendor', 'bower_components'));
$list_files = list_files($dir, 100, $exclusions);
$list_files = array_map('plugin_basename', $list_files);
$plugin_files = array_merge($plugin_files, $list_files);
$plugin_files = array_values(array_unique($plugin_files));
}
return $plugin_files;
}
function get_plugins($plugin_folder = '')
{
$cache_plugins = wp_cache_get('plugins', 'plugins');
if (!$cache_plugins) {
$cache_plugins = array();
}
if (isset($cache_plugins[$plugin_folder])) {
return $cache_plugins[$plugin_folder];
}
$wp_plugins = array();
$plugin_root = WP_PLUGIN_DIR;
if (!empty($plugin_folder)) {
$plugin_root .= $plugin_folder;
}
$plugins_dir = @opendir($plugin_root);
$plugin_files = array();
if ($plugins_dir) {
while (($file = readdir($plugins_dir)) !== false) {
if ('.' === substr($file, 0, 1)) {
continue;
}
if (is_dir($plugin_root . '/' . $file)) {
$plugins_subdir = @opendir($plugin_root . '/' . $file);
if ($plugins_subdir) {
while (($subfile = readdir($plugins_subdir)) !== false) {
if ('.' === substr($subfile, 0, 1)) {
continue;
}
if ('.php' === substr($subfile, -4)) {
$plugin_files[] = "{$file}/{$subfile}";
}
}
closedir($plugins_subdir);
}
} else {
if ('.php' === substr($file, -4)) {
$plugin_files[] = $file;
}
}
}
closedir($plugins_dir);
}
if (empty($plugin_files)) {
return $wp_plugins;
}
foreach ($plugin_files as $plugin_file) {
if (!is_readable("{$plugin_root}/{$plugin_file}")) {
continue;
}
$plugin_data = get_plugin_data("{$plugin_root}/{$plugin_file}", false, false);
if (empty($plugin_data['Name'])) {
continue;
}
$wp_plugins[plugin_basename($plugin_file)] = $plugin_data;
}
uasort($wp_plugins, '_sort_uname_callback');
$cache_plugins[$plugin_folder] = $wp_plugins;
wp_cache_set('plugins', $cache_plugins, 'plugins');
return $wp_plugins;
}
function get_mu_plugins()
{
$wp_plugins = array();
$plugin_files = array();
if (!is_dir(WPMU_PLUGIN_DIR)) {
return $wp_plugins;
}
$plugins_dir = @opendir(WPMU_PLUGIN_DIR);
if ($plugins_dir) {
while (($file = readdir($plugins_dir)) !== false) {
if ('.php' === substr($file, -4)) {
$plugin_files[] = $file;
}
}
} else {
return $wp_plugins;
}
closedir($plugins_dir);
if (empty($plugin_files)) {
return $wp_plugins;
}
foreach ($plugin_files as $plugin_file) {
if (!is_readable(WPMU_PLUGIN_DIR . "/{$plugin_file}")) {
continue;
}
$plugin_data = get_plugin_data(WPMU_PLUGIN_DIR . "/{$plugin_file}", false, false);
if (empty($plugin_data['Name'])) {
$plugin_data['Name'] = $plugin_file;
}
$wp_plugins[$plugin_file] = $plugin_data;
}
if (isset($wp_plugins['index.php']) && filesize(WPMU_PLUGIN_DIR . '/index.php') <= 30) {
unset($wp_plugins['index.php']);
}
uasort($wp_plugins, '_sort_uname_callback');
return $wp_plugins;
}
function _sort_uname_callback($a, $b)
{
return strnatcasecmp($a['Name'], $b['Name']);
}
function get_dropins()
{
$dropins = array();
$plugin_files = array();
$_dropins = _get_dropins();
$plugins_dir = @opendir(WP_CONTENT_DIR);
if ($plugins_dir) {
while (($file = readdir($plugins_dir)) !== false) {
if (isset($_dropins[$file])) {
$plugin_files[] = $file;
}
}
} else {
return $dropins;
}
closedir($plugins_dir);
if (empty($plugin_files)) {
return $dropins;
}
foreach ($plugin_files as $plugin_file) {
if (!is_readable(WP_CONTENT_DIR . "/{$plugin_file}")) {
continue;
}
$plugin_data = get_plugin_data(WP_CONTENT_DIR . "/{$plugin_file}", false, false);
if (empty($plugin_data['Name'])) {
$plugin_data['Name'] = $plugin_file;
}
$dropins[$plugin_file] = $plugin_data;
}
uksort($dropins, 'strnatcasecmp');
return $dropins;
}
function _get_dropins()
{
$dropins = array('advanced-cache.php' => array(__('Advanced caching plugin.'), 'WP_CACHE'), 'db.php' => array(__('Custom database class.'), true), 'db-error.php' => array(__('Custom database error message.'), true), 'install.php' => array(__('Custom installation script.'), true), 'maintenance.php' => array(__('Custom maintenance message.'), true), 'object-cache.php' => array(__('External object cache.'), true), 'php-error.php' => array(__('Custom PHP error message.'), true), 'fatal-error-handler.php' => array(__('Custom PHP fatal error handler.'), true));
if (is_multisite()) {
$dropins['sunrise.php'] = array(__('Executed before Multisite is loaded.'), 'SUNRISE');
$dropins['blog-deleted.php'] = array(__('Custom site deleted message.'), true);
$dropins['blog-inactive.php'] = array(__('Custom site inactive message.'), true);
$dropins['blog-suspended.php'] = array(__('Custom site suspended message.'), true);
}
return $dropins;
}
function is_plugin_active($plugin)
{
return in_array($plugin, (array) get_option('active_plugins', array()), true) || is_plugin_active_for_network($plugin);
}
function is_plugin_inactive($plugin)
{
return !is_plugin_active($plugin);
}
function is_plugin_active_for_network($plugin)
{
if (!is_multisite()) {
return false;
}
$plugins = get_site_option('active_sitewide_plugins');
if (isset($plugins[$plugin])) {
return true;
}
return false;
}
function is_network_only_plugin($plugin)
{
$plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin);
if ($plugin_data) {
return $plugin_data['Network'];
}
return false;
}
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;
$current = get_site_option('active_sitewide_plugins', array());
$_GET['networkwide'] = 1;
} else {
$current = get_option('active_plugins', array());
}
$valid = validate_plugin($plugin);
if (is_wp_error($valid)) {
return $valid;
}
$requirements = validate_plugin_requirements($plugin);
if (is_wp_error($requirements)) {
return $requirements;
}
if ($network_wide && !isset($current[$plugin]) || !$network_wide && !in_array($plugin, $current, true)) {
if (!empty($redirect)) {
wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));
}
ob_start();
if (!defined('WP_SANDBOX_SCRAPING')) {
define('WP_SANDBOX_SCRAPING', true);
}
wp_register_plugin_realpath(WP_PLUGIN_DIR . '/' . $plugin);
$_wp_plugin_file = $plugin;
include_once WP_PLUGIN_DIR . '/' . $plugin;
$plugin = $_wp_plugin_file;
if (!$silent) {
do_action('activate_plugin', $plugin, $network_wide);
do_action("activate_{$plugin}", $network_wide);
}
if ($network_wide) {
$current = get_site_option('active_sitewide_plugins', array());
$current[$plugin] = time();
update_site_option('active_sitewide_plugins', $current);
} else {
$current = get_option('active_plugins', array());
$current[] = $plugin;
sort($current);
update_option('active_plugins', $current);
}
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);
}
ob_end_clean();
}
return null;
}
function deactivate_plugins($plugins, $silent = false, $network_wide = null)
{
if (is_multisite()) {
$network_current = get_site_option('active_sitewide_plugins', array());
}
$current = get_option('active_plugins', array());
$do_blog = false;
$do_network = false;
foreach ((array) $plugins as $plugin) {
$plugin = plugin_basename(trim($plugin));
if (!is_plugin_active($plugin)) {
continue;
}
$network_deactivating = false !== $network_wide && is_plugin_active_for_network($plugin);
if (!$silent) {
do_action('deactivate_plugin', $plugin, $network_deactivating);
}
if (false !== $network_wide) {
if (is_plugin_active_for_network($plugin)) {
$do_network = true;
unset($network_current[$plugin]);
} elseif ($network_wide) {
continue;
}
}
if (true !== $network_wide) {
$key = array_search($plugin, $current, true);
if (false !== $key) {
$do_blog = true;
unset($current[$key]);
}
}
if ($do_blog && wp_is_recovery_mode()) {
list($extension) = explode('/', $plugin);
wp_paused_plugins()->delete($extension);
}
if (!$silent) {
do_action("deactivate_{$plugin}", $network_deactivating);
do_action('deactivated_plugin', $plugin, $network_deactivating);
}
}
if ($do_blog) {
update_option('active_plugins', $current);
}
if ($do_network) {
update_site_option('active_sitewide_plugins', $network_current);
}
}
function activate_plugins($plugins, $redirect = '', $network_wide = false, $silent = false)
{
if (!is_array($plugins)) {
$plugins = array($plugins);
}
$errors = array();
foreach ($plugins as $plugin) {
if (!empty($redirect)) {
$redirect = add_query_arg('plugin', $plugin, $redirect);
}
$result = activate_plugin($plugin, $redirect, $network_wide, $silent);
if (is_wp_error($result)) {
$errors[$plugin] = $result;
}
}
if (!empty($errors)) {
return new WP_Error('plugins_invalid', __('One of the plugins is invalid.'), $errors);
}
return true;
}
function delete_plugins($plugins, $deprecated = '')
{
global $wp_filesystem;
if (empty($plugins)) {
return false;
}
$checked = array();
foreach ($plugins as $plugin) {
$checked[] = 'checked[]=' . $plugin;
}
$url = wp_nonce_url('plugins.php?action=delete-selected&verify-delete=1&' . implode('&', $checked), 'bulk-plugins');
ob_start();
$credentials = request_filesystem_credentials($url);
$data = ob_get_clean();
if (false === $credentials) {
if (!empty($data)) {
require_once ABSPATH . 'wp-admin/admin-header.php';
echo $data;
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
}
return;
}
if (!WP_Filesystem($credentials)) {
ob_start();
request_filesystem_credentials($url, '', true);
$data = ob_get_clean();
if (!empty($data)) {
require_once ABSPATH . 'wp-admin/admin-header.php';
echo $data;
require_once ABSPATH . 'wp-admin/admin-footer.php';
exit;
}
return;
}
if (!is_object($wp_filesystem)) {
return new WP_Error('fs_unavailable', __('Could not access filesystem.'));
}
if (is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->has_errors()) {
return new WP_Error('fs_error', __('Filesystem error.'), $wp_filesystem->errors);
}
$plugins_dir = $wp_filesystem->wp_plugins_dir();
if (empty($plugins_dir)) {
return new WP_Error('fs_no_plugins_dir', __('Unable to locate WordPress plugin directory.'));
}
$plugins_dir = trailingslashit($plugins_dir);
$plugin_translations = wp_get_installed_translations('plugins');
$errors = array();
foreach ($plugins as $plugin_file) {
if (is_uninstallable_plugin($plugin_file)) {
uninstall_plugin($plugin_file);
}
do_action('delete_plugin', $plugin_file);
$this_plugin_dir = trailingslashit(dirname($plugins_dir . $plugin_file));
if (strpos($plugin_file, '/') && $this_plugin_dir !== $plugins_dir) {
$deleted = $wp_filesystem->delete($this_plugin_dir, true);
} else {
$deleted = $wp_filesystem->delete($plugins_dir . $plugin_file);
}
do_action('deleted_plugin', $plugin_file, $deleted);
if (!$deleted) {
$errors[] = $plugin_file;
continue;
}
$plugin_slug = dirname($plugin_file);
if ('.' !== $plugin_slug && !empty($plugin_translations[$plugin_slug])) {
$translations = $plugin_translations[$plugin_slug];
foreach ($translations as $translation => $data) {
$wp_filesystem->delete(WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.po');
$wp_filesystem->delete(WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.mo');
$json_translation_files = glob(WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '-*.json');
if ($json_translation_files) {
array_map(array($wp_filesystem, 'delete'), $json_translation_files);
}
}
}
}
$current = get_site_transient('update_plugins');
if ($current) {
$deleted = array_diff($plugins, $errors);
foreach ($deleted as $plugin_file) {
unset($current->response[$plugin_file]);
}
set_site_transient('update_plugins', $current);
}
if (!empty($errors)) {
if (1 === count($errors)) {
$message = __('Could not fully remove the plugin %s.');
} else {
$message = __('Could not fully remove the plugins %s.');
}
return new WP_Error('could_not_remove_plugin', sprintf($message, implode(', ', $errors)));
}
return true;
}
function validate_active_plugins()
{
$plugins = get_option('active_plugins', array());
if (!is_array($plugins)) {
update_option('active_plugins', array());
$plugins = array();
}
if (is_multisite() && current_user_can('manage_network_plugins')) {
$network_plugins = (array) get_site_option('active_sitewide_plugins', array());
$plugins = array_merge($plugins, array_keys($network_plugins));
}
if (empty($plugins)) {
return array();
}
$invalid = array();
foreach ($plugins as $plugin) {
$result = validate_plugin($plugin);
if (is_wp_error($result)) {
$invalid[$plugin] = $result;
deactivate_plugins($plugin, true);
}
}
return $invalid;
}
function validate_plugin($plugin)
{
if (validate_file($plugin)) {
return new WP_Error('plugin_invalid', __('Invalid plugin path.'));
}
if (!file_exists(WP_PLUGIN_DIR . '/' . $plugin)) {
return new WP_Error('plugin_not_found', __('Plugin file does not exist.'));
}
$installed_plugins = get_plugins();
if (!isset($installed_plugins[$plugin])) {
return new WP_Error('no_plugin_header', __('The plugin does not have a valid header.'));
}
return 0;
}
function validate_plugin_requirements($plugin)
{
$plugin_headers = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin);
$requirements = array('requires' => !empty($plugin_headers['RequiresWP']) ? $plugin_headers['RequiresWP'] : '', 'requires_php' => !empty($plugin_headers['RequiresPHP']) ? $plugin_headers['RequiresPHP'] : '');
$readme_file = WP_PLUGIN_DIR . '/' . dirname($plugin) . '/readme.txt';
if (file_exists($readme_file)) {
$readme_headers = get_file_data($readme_file, array('requires' => 'Requires at least', 'requires_php' => 'Requires PHP'), 'plugin');
$requirements = array_merge($readme_headers, $requirements);
}
$compatible_wp = is_wp_version_compatible($requirements['requires']);
$compatible_php = is_php_version_compatible($requirements['requires_php']);
$php_update_message = '</p><p>' . sprintf(__('<a href="%s">Learn more about updating PHP</a>.'), esc_url(wp_get_update_php_url()));
$annotation = wp_get_update_php_annotation();
if ($annotation) {
$php_update_message .= '</p><p><em>' . $annotation . '</em>';
}
if (!$compatible_wp && !$compatible_php) {
return new WP_Error('plugin_wp_php_incompatible', '<p>' . sprintf(_x('<strong>Error:</strong> Current versions of WordPress (%1$s) and PHP (%2$s) do not meet minimum requirements for %3$s. The plugin requires WordPress %4$s and PHP %5$s.', 'plugin'), get_bloginfo('version'), phpversion(), $plugin_headers['Name'], $requirements['requires'], $requirements['requires_php']) . $php_update_message . '</p>');
} elseif (!$compatible_php) {
return new WP_Error('plugin_php_incompatible', '<p>' . sprintf(_x('<strong>Error:</strong> Current PHP version (%1$s) does not meet minimum requirements for %2$s. The plugin requires PHP %3$s.', 'plugin'), phpversion(), $plugin_headers['Name'], $requirements['requires_php']) . $php_update_message . '</p>');
} elseif (!$compatible_wp) {
return new WP_Error('plugin_wp_incompatible', '<p>' . sprintf(_x('<strong>Error:</strong> Current WordPress version (%1$s) does not meet minimum requirements for %2$s. The plugin requires WordPress %3$s.', 'plugin'), get_bloginfo('version'), $plugin_headers['Name'], $requirements['requires']) . '</p>');
}
return true;
}
function is_uninstallable_plugin($plugin)
{
$file = plugin_basename($plugin);
$uninstallable_plugins = (array) get_option('uninstall_plugins');
if (isset($uninstallable_plugins[$file]) || file_exists(WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php')) {
return true;
}
return false;
}
function uninstall_plugin($plugin)
{
$file = plugin_basename($plugin);
$uninstallable_plugins = (array) get_option('uninstall_plugins');
do_action('pre_uninstall_plugin', $plugin, $uninstallable_plugins);
if (file_exists(WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php')) {
if (isset($uninstallable_plugins[$file])) {
unset($uninstallable_plugins[$file]);
update_option('uninstall_plugins', $uninstallable_plugins);
}
unset($uninstallable_plugins);
define('WP_UNINSTALL_PLUGIN', $file);
wp_register_plugin_realpath(WP_PLUGIN_DIR . '/' . $file);
include_once WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php';
return true;
}
if (isset($uninstallable_plugins[$file])) {
$callable = $uninstallable_plugins[$file];
unset($uninstallable_plugins[$file]);
update_option('uninstall_plugins', $uninstallable_plugins);
unset($uninstallable_plugins);
wp_register_plugin_realpath(WP_PLUGIN_DIR . '/' . $file);
include_once WP_PLUGIN_DIR . '/' . $file;
add_action("uninstall_{$file}", $callable);
do_action("uninstall_{$file}");
}
}
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;
$menu_slug = plugin_basename($menu_slug);
$admin_page_hooks[$menu_slug] = sanitize_title($menu_title);
$hookname = get_plugin_page_hookname($menu_slug, '');
if (!empty($function) && !empty($hookname) && current_user_can($capability)) {
add_action($hookname, $function);
}
if (empty($icon_url)) {
$icon_url = 'dashicons-admin-generic';
$icon_class = 'menu-icon-generic ';
} else {
$icon_url = set_url_scheme($icon_url);
$icon_class = '';
}
$new_menu = array($menu_title, $capability, $menu_slug, $page_title, 'menu-top ' . $icon_class . $hookname, $hookname, $icon_url);
if (null === $position) {
$menu[] = $new_menu;
} elseif (isset($menu["{$position}"])) {
$position = $position + substr(base_convert(md5($menu_slug . $menu_title), 16, 10), -5) * 1.0E-5;
$menu["{$position}"] = $new_menu;
} else {
$menu[$position] = $new_menu;
}
$_registered_pages[$hookname] = true;
$_parent_pages[$menu_slug] = false;
return $hookname;
}
function add_submenu_page($parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
global $submenu, $menu, $_wp_real_parent_file, $_wp_submenu_nopriv, $_registered_pages, $_parent_pages;
$menu_slug = plugin_basename($menu_slug);
$parent_slug = plugin_basename($parent_slug);
if (isset($_wp_real_parent_file[$parent_slug])) {
$parent_slug = $_wp_real_parent_file[$parent_slug];
}
if (!current_user_can($capability)) {
$_wp_submenu_nopriv[$parent_slug][$menu_slug] = true;
return false;
}
if (!isset($submenu[$parent_slug]) && $menu_slug !== $parent_slug) {
foreach ((array) $menu as $parent_menu) {
if ($parent_menu[2] === $parent_slug && current_user_can($parent_menu[1])) {
$submenu[$parent_slug][] = array_slice($parent_menu, 0, 4);
}
}
}
$new_sub_menu = array($menu_title, $capability, $menu_slug, $page_title);
if (!is_int($position)) {
if (null !== $position) {
_doing_it_wrong(__FUNCTION__, sprintf(__('The seventh parameter passed to %s should be an integer representing menu position.'), '<code>add_submenu_page()</code>'), '5.3.0');
}
$submenu[$parent_slug][] = $new_sub_menu;
} else {
if (!isset($submenu[$parent_slug]) || $position >= count($submenu[$parent_slug])) {
$submenu[$parent_slug][] = $new_sub_menu;
} else {
$position = max($position, 0);
if (0 === $position) {
array_unshift($submenu[$parent_slug], $new_sub_menu);
} else {
$before_items = array_slice($submenu[$parent_slug], 0, $position, true);
$after_items = array_slice($submenu[$parent_slug], $position, null, true);
$before_items[] = $new_sub_menu;
$submenu[$parent_slug] = array_merge($before_items, $after_items);
}
}
}
ksort($submenu[$parent_slug]);
$hookname = get_plugin_page_hookname($menu_slug, $parent_slug);
if (!empty($function) && !empty($hookname)) {
add_action($hookname, $function);
}
$_registered_pages[$hookname] = true;
if ('tools.php' === $parent_slug) {
$_registered_pages[get_plugin_page_hookname($menu_slug, 'edit.php')] = true;
}
$_parent_pages[$menu_slug] = $parent_slug;
return $hookname;
}
function add_management_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('tools.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_options_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('options-general.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_theme_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('themes.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_plugins_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('plugins.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_users_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
if (current_user_can('edit_users')) {
$parent = 'users.php';
} else {
$parent = 'profile.php';
}
return add_submenu_page($parent, $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_dashboard_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('index.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_posts_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('edit.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_media_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('upload.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_links_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_pages_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
function add_comments_page($page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null)
{
return add_submenu_page('edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position);
}
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;
}
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;
}
function menu_page_url($menu_slug, $echo = true)
{
global $_parent_pages;
if (isset($_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);
}
} else {
$url = '';
}
$url = esc_url($url);
if ($echo) {
echo $url;
}
return $url;
}
function get_admin_page_parent($parent = '')
{
global $parent_file, $menu, $submenu, $pagenow, $typenow, $plugin_page, $_wp_real_parent_file, $_wp_menu_nopriv, $_wp_submenu_nopriv;
if (!empty($parent) && 'admin.php' !== $parent) {
if (isset($_wp_real_parent_file[$parent])) {
$parent = $_wp_real_parent_file[$parent];
}
return $parent;
}
if ('admin.php' === $pagenow && isset($plugin_page)) {
foreach ((array) $menu as $parent_menu) {
if ($parent_menu[2] === $plugin_page) {
$parent_file = $plugin_page;
if (isset($_wp_real_parent_file[$parent_file])) {
$parent_file = $_wp_real_parent_file[$parent_file];
}
return $parent_file;
}
}
if (isset($_wp_menu_nopriv[$plugin_page])) {
$parent_file = $plugin_page;
if (isset($_wp_real_parent_file[$parent_file])) {
$parent_file = $_wp_real_parent_file[$parent_file];
}
return $parent_file;
}
}
if (isset($plugin_page) && isset($_wp_submenu_nopriv[$pagenow][$plugin_page])) {
$parent_file = $pagenow;
if (isset($_wp_real_parent_file[$parent_file])) {
$parent_file = $_wp_real_parent_file[$parent_file];
}
return $parent_file;
}
foreach (array_keys((array) $submenu) as $parent) {
foreach ($submenu[$parent] as $submenu_array) {
if (isset($_wp_real_parent_file[$parent])) {
$parent = $_wp_real_parent_file[$parent];
}
if (!empty($typenow) && "{$pagenow}?post_type={$typenow}" === $submenu_array[2]) {
$parent_file = $parent;
return $parent;
} elseif (empty($typenow) && $pagenow === $submenu_array[2] && (empty($parent_file) || false === strpos($parent_file, '?'))) {
$parent_file = $parent;
return $parent;
} elseif (isset($plugin_page) && $plugin_page === $submenu_array[2]) {
$parent_file = $parent;
return $parent;
}
}
}
if (empty($parent_file)) {
$parent_file = '';
}
return '';
}
function get_admin_page_title()
{
global $title, $menu, $submenu, $pagenow, $plugin_page, $typenow;
if (!empty($title)) {
return $title;
}
$hook = get_plugin_page_hook($plugin_page, $pagenow);
$parent = get_admin_page_parent();
$parent1 = $parent;
if (empty($parent)) {
foreach ((array) $menu as $menu_array) {
if (isset($menu_array[3])) {
if ($menu_array[2] === $pagenow) {
$title = $menu_array[3];
return $menu_array[3];
} elseif (isset($plugin_page) && $plugin_page === $menu_array[2] && $hook === $menu_array[5]) {
$title = $menu_array[3];
return $menu_array[3];
}
} else {
$title = $menu_array[0];
return $title;
}
}
} else {
foreach (array_keys($submenu) as $parent) {
foreach ($submenu[$parent] as $submenu_array) {
if (isset($plugin_page) && $plugin_page === $submenu_array[2] && ($pagenow === $parent || $plugin_page === $parent || $plugin_page === $hook || 'admin.php' === $pagenow && $parent1 !== $submenu_array[2] || !empty($typenow) && "{$pagenow}?post_type={$typenow}" === $parent)) {
$title = $submenu_array[3];
return $submenu_array[3];
}
if ($submenu_array[2] !== $pagenow || isset($_GET['page'])) {
continue;
}
if (isset($submenu_array[3])) {
$title = $submenu_array[3];
return $submenu_array[3];
} else {
$title = $submenu_array[0];
return $title;
}
}
}
if (empty($title)) {
foreach ($menu as $menu_array) {
if (isset($plugin_page) && $plugin_page === $menu_array[2] && 'admin.php' === $pagenow && $parent1 === $menu_array[2]) {
$title = $menu_array[3];
return $menu_array[3];
}
}
}
}
return $title;
}
function get_plugin_page_hook($plugin_page, $parent_page)
{
$hook = get_plugin_page_hookname($plugin_page, $parent_page);
if (has_action($hook)) {
return $hook;
} else {
return null;
}
}
function get_plugin_page_hookname($plugin_page, $parent_page)
{
global $admin_page_hooks;
$parent = get_admin_page_parent($parent_page);
$page_type = 'admin';
if (empty($parent_page) || 'admin.php' === $parent_page || isset($admin_page_hooks[$plugin_page])) {
if (isset($admin_page_hooks[$plugin_page])) {
$page_type = 'toplevel';
} elseif (isset($admin_page_hooks[$parent])) {
$page_type = $admin_page_hooks[$parent];
}
} elseif (isset($admin_page_hooks[$parent])) {
$page_type = $admin_page_hooks[$parent];
}
$plugin_name = preg_replace('!\\.php!', '', $plugin_page);
return $page_type . '_page_' . $plugin_name;
}
function user_can_access_admin_page()
{
global $pagenow, $menu, $submenu, $_wp_menu_nopriv, $_wp_submenu_nopriv, $plugin_page, $_registered_pages;
$parent = get_admin_page_parent();
if (!isset($plugin_page) && isset($_wp_submenu_nopriv[$parent][$pagenow])) {
return false;
}
if (isset($plugin_page)) {
if (isset($_wp_submenu_nopriv[$parent][$plugin_page])) {
return false;
}
$hookname = get_plugin_page_hookname($plugin_page, $parent);
if (!isset($_registered_pages[$hookname])) {
return false;
}
}
if (empty($parent)) {
if (isset($_wp_menu_nopriv[$pagenow])) {
return false;
}
if (isset($_wp_submenu_nopriv[$pagenow][$pagenow])) {
return false;
}
if (isset($plugin_page) && isset($_wp_submenu_nopriv[$pagenow][$plugin_page])) {
return false;
}
if (isset($plugin_page) && isset($_wp_menu_nopriv[$plugin_page])) {
return false;
}
foreach (array_keys($_wp_submenu_nopriv) as $key) {
if (isset($_wp_submenu_nopriv[$key][$pagenow])) {
return false;
}
if (isset($plugin_page) && isset($_wp_submenu_nopriv[$key][$plugin_page])) {
return false;
}
}
return true;
}
if (isset($plugin_page) && $plugin_page === $parent && isset($_wp_menu_nopriv[$plugin_page])) {
return false;
}
if (isset($submenu[$parent])) {
foreach ($submenu[$parent] as $submenu_array) {
if (isset($plugin_page) && $submenu_array[2] === $plugin_page) {
return current_user_can($submenu_array[1]);
} elseif ($submenu_array[2] === $pagenow) {
return current_user_can($submenu_array[1]);
}
}
}
foreach ($menu as $menu_array) {
if ($menu_array[2] === $parent) {
return current_user_can($menu_array[1]);
}
}
return true;
}
function option_update_filter($options)
{
global $new_allowed_options;
if (is_array($new_allowed_options)) {
$options = add_allowed_options($new_allowed_options, $options);
}
return $options;
}
function add_allowed_options($new_options, $options = '')
{
if ('' === $options) {
global $allowed_options;
} else {
$allowed_options = $options;
}
foreach ($new_options as $page => $keys) {
foreach ($keys as $key) {
if (!isset($allowed_options[$page]) || !is_array($allowed_options[$page])) {
$allowed_options[$page] = array();
$allowed_options[$page][] = $key;
} else {
$pos = array_search($key, $allowed_options[$page], true);
if (false === $pos) {
$allowed_options[$page][] = $key;
}
}
}
}
return $allowed_options;
}
function remove_allowed_options($del_options, $options = '')
{
if ('' === $options) {
global $allowed_options;
} else {
$allowed_options = $options;
}
foreach ($del_options as $page => $keys) {
foreach ($keys as $key) {
if (isset($allowed_options[$page]) && is_array($allowed_options[$page])) {
$pos = array_search($key, $allowed_options[$page], true);
if (false !== $pos) {
unset($allowed_options[$page][$pos]);
}
}
}
}
return $allowed_options;
}
function settings_fields($option_group)
{
echo "<input type='hidden' name='option_page' value='" . esc_attr($option_group) . "' />";
echo '<input type="hidden" name="action" value="update" />';
wp_nonce_field("{$option_group}-options");
}
function wp_clean_plugins_cache($clear_update_cache = true)
{
if ($clear_update_cache) {
delete_site_transient('update_plugins');
}
wp_cache_delete('plugins', 'plugins');
}
function plugin_sandbox_scrape($plugin)
{
if (!defined('WP_SANDBOX_SCRAPING')) {
define('WP_SANDBOX_SCRAPING', true);
}
wp_register_plugin_realpath(WP_PLUGIN_DIR . '/' . $plugin);
include WP_PLUGIN_DIR . '/' . $plugin;
}
function wp_add_privacy_policy_content($plugin_name, $policy_text)
{
if (!is_admin()) {
_doing_it_wrong(__FUNCTION__, sprintf(__('The suggested privacy policy content should be added only in wp-admin by using the %s (or later) action.'), '<code>admin_init</code>'), '4.9.7');
return;
} elseif (!doing_action('admin_init') && !did_action('admin_init')) {
_doing_it_wrong(__FUNCTION__, sprintf(__('The suggested privacy policy content should be added by using the %s (or later) action. Please see the inline documentation.'), '<code>admin_init</code>'), '4.9.7');
return;
}
if (!class_exists('WP_Privacy_Policy_Content')) {
require_once ABSPATH . 'wp-admin/includes/class-wp-privacy-policy-content.php';
}
WP_Privacy_Policy_Content::add($plugin_name, $policy_text);
}
function is_plugin_paused($plugin)
{
if (!isset($GLOBALS['_paused_plugins'])) {
return false;
}
if (!is_plugin_active($plugin)) {
return false;
}
list($plugin) = explode('/', $plugin);
return array_key_exists($plugin, $GLOBALS['_paused_plugins']);
}
function wp_get_plugin_error($plugin)
{
if (!isset($GLOBALS['_paused_plugins'])) {
return false;
}
list($plugin) = explode('/', $plugin);
if (!array_key_exists($plugin, $GLOBALS['_paused_plugins'])) {
return false;
}
return $GLOBALS['_paused_plugins'][$plugin];
}
function resume_plugin($plugin, $redirect = '')
{
if (!empty($redirect)) {
wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-resume-error_' . $plugin), $redirect));
ob_start();
plugin_sandbox_scrape($plugin);
ob_clean();
}
list($extension) = explode('/', $plugin);
$result = wp_paused_plugins()->delete($extension);
if (!$result) {
return new WP_Error('could_not_resume_plugin', __('Could not resume the plugin.'));
}
return true;
}
function paused_plugins_notice()
{
if ('plugins.php' === $GLOBALS['pagenow']) {
return;
}
if (!current_user_can('resume_plugins')) {
return;
}
if (!isset($GLOBALS['_paused_plugins']) || empty($GLOBALS['_paused_plugins'])) {
return;
}
printf('<div class="notice notice-error"><p><strong>%s</strong><br>%s</p><p><a href="%s">%s</a></p></div>', __('One or more plugins failed to load properly.'), __('You can find more details and make changes on the Plugins screen.'), esc_url(admin_url('plugins.php?plugin_status=paused')), __('Go to the Plugins screen'));
}