Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-includes
/
wp-admin
/
includes
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?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')); }