Edit File by line
/home/zeestwma/ajeebong.../wp-admin/includes
File: plugin.php
*/
[1000] Fix | Delete
do_action( 'deleted_plugin', $plugin_file, $deleted );
[1001] Fix | Delete
[1002] Fix | Delete
if ( ! $deleted ) {
[1003] Fix | Delete
$errors[] = $plugin_file;
[1004] Fix | Delete
continue;
[1005] Fix | Delete
}
[1006] Fix | Delete
[1007] Fix | Delete
$plugin_slug = dirname( $plugin_file );
[1008] Fix | Delete
[1009] Fix | Delete
if ( 'hello.php' === $plugin_file ) {
[1010] Fix | Delete
$plugin_slug = 'hello-dolly';
[1011] Fix | Delete
}
[1012] Fix | Delete
[1013] Fix | Delete
// Remove language files, silently.
[1014] Fix | Delete
if ( '.' !== $plugin_slug && ! empty( $plugin_translations[ $plugin_slug ] ) ) {
[1015] Fix | Delete
$translations = $plugin_translations[ $plugin_slug ];
[1016] Fix | Delete
[1017] Fix | Delete
foreach ( $translations as $translation => $data ) {
[1018] Fix | Delete
$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.po' );
[1019] Fix | Delete
$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.mo' );
[1020] Fix | Delete
$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.l10n.php' );
[1021] Fix | Delete
[1022] Fix | Delete
$json_translation_files = glob( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '-*.json' );
[1023] Fix | Delete
if ( $json_translation_files ) {
[1024] Fix | Delete
array_map( array( $wp_filesystem, 'delete' ), $json_translation_files );
[1025] Fix | Delete
}
[1026] Fix | Delete
}
[1027] Fix | Delete
}
[1028] Fix | Delete
}
[1029] Fix | Delete
[1030] Fix | Delete
// Remove deleted plugins from the plugin updates list.
[1031] Fix | Delete
$current = get_site_transient( 'update_plugins' );
[1032] Fix | Delete
if ( $current ) {
[1033] Fix | Delete
// Don't remove the plugins that weren't deleted.
[1034] Fix | Delete
$deleted = array_diff( $plugins, $errors );
[1035] Fix | Delete
[1036] Fix | Delete
foreach ( $deleted as $plugin_file ) {
[1037] Fix | Delete
unset( $current->response[ $plugin_file ] );
[1038] Fix | Delete
}
[1039] Fix | Delete
[1040] Fix | Delete
set_site_transient( 'update_plugins', $current );
[1041] Fix | Delete
}
[1042] Fix | Delete
[1043] Fix | Delete
if ( ! empty( $errors ) ) {
[1044] Fix | Delete
if ( 1 === count( $errors ) ) {
[1045] Fix | Delete
/* translators: %s: Plugin filename. */
[1046] Fix | Delete
$message = __( 'Could not fully remove the plugin %s.' );
[1047] Fix | Delete
} else {
[1048] Fix | Delete
/* translators: %s: Comma-separated list of plugin filenames. */
[1049] Fix | Delete
$message = __( 'Could not fully remove the plugins %s.' );
[1050] Fix | Delete
}
[1051] Fix | Delete
[1052] Fix | Delete
return new WP_Error( 'could_not_remove_plugin', sprintf( $message, implode( ', ', $errors ) ) );
[1053] Fix | Delete
}
[1054] Fix | Delete
[1055] Fix | Delete
return true;
[1056] Fix | Delete
}
[1057] Fix | Delete
[1058] Fix | Delete
/**
[1059] Fix | Delete
* Validates active plugins.
[1060] Fix | Delete
*
[1061] Fix | Delete
* Validate all active plugins, deactivates invalid and
[1062] Fix | Delete
* returns an array of deactivated ones.
[1063] Fix | Delete
*
[1064] Fix | Delete
* @since 2.5.0
[1065] Fix | Delete
* @return WP_Error[] Array of plugin errors keyed by plugin file name.
[1066] Fix | Delete
*/
[1067] Fix | Delete
function validate_active_plugins() {
[1068] Fix | Delete
$plugins = get_option( 'active_plugins', array() );
[1069] Fix | Delete
// Validate vartype: array.
[1070] Fix | Delete
if ( ! is_array( $plugins ) ) {
[1071] Fix | Delete
update_option( 'active_plugins', array() );
[1072] Fix | Delete
$plugins = array();
[1073] Fix | Delete
}
[1074] Fix | Delete
[1075] Fix | Delete
if ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) {
[1076] Fix | Delete
$network_plugins = (array) get_site_option( 'active_sitewide_plugins', array() );
[1077] Fix | Delete
$plugins = array_merge( $plugins, array_keys( $network_plugins ) );
[1078] Fix | Delete
}
[1079] Fix | Delete
[1080] Fix | Delete
if ( empty( $plugins ) ) {
[1081] Fix | Delete
return array();
[1082] Fix | Delete
}
[1083] Fix | Delete
[1084] Fix | Delete
$invalid = array();
[1085] Fix | Delete
[1086] Fix | Delete
// Invalid plugins get deactivated.
[1087] Fix | Delete
foreach ( $plugins as $plugin ) {
[1088] Fix | Delete
$result = validate_plugin( $plugin );
[1089] Fix | Delete
if ( is_wp_error( $result ) ) {
[1090] Fix | Delete
$invalid[ $plugin ] = $result;
[1091] Fix | Delete
deactivate_plugins( $plugin, true );
[1092] Fix | Delete
}
[1093] Fix | Delete
}
[1094] Fix | Delete
return $invalid;
[1095] Fix | Delete
}
[1096] Fix | Delete
[1097] Fix | Delete
/**
[1098] Fix | Delete
* Validates the plugin path.
[1099] Fix | Delete
*
[1100] Fix | Delete
* Checks that the main plugin file exists and is a valid plugin. See validate_file().
[1101] Fix | Delete
*
[1102] Fix | Delete
* @since 2.5.0
[1103] Fix | Delete
*
[1104] Fix | Delete
* @param string $plugin Path to the plugin file relative to the plugins directory.
[1105] Fix | Delete
* @return int|WP_Error 0 on success, WP_Error on failure.
[1106] Fix | Delete
*/
[1107] Fix | Delete
function validate_plugin( $plugin ) {
[1108] Fix | Delete
if ( validate_file( $plugin ) ) {
[1109] Fix | Delete
return new WP_Error( 'plugin_invalid', __( 'Invalid plugin path.' ) );
[1110] Fix | Delete
}
[1111] Fix | Delete
if ( ! file_exists( WP_PLUGIN_DIR . '/' . $plugin ) ) {
[1112] Fix | Delete
return new WP_Error( 'plugin_not_found', __( 'Plugin file does not exist.' ) );
[1113] Fix | Delete
}
[1114] Fix | Delete
[1115] Fix | Delete
$installed_plugins = get_plugins();
[1116] Fix | Delete
if ( ! isset( $installed_plugins[ $plugin ] ) ) {
[1117] Fix | Delete
return new WP_Error( 'no_plugin_header', __( 'The plugin does not have a valid header.' ) );
[1118] Fix | Delete
}
[1119] Fix | Delete
return 0;
[1120] Fix | Delete
}
[1121] Fix | Delete
[1122] Fix | Delete
/**
[1123] Fix | Delete
* Validates the plugin requirements for WordPress version and PHP version.
[1124] Fix | Delete
*
[1125] Fix | Delete
* Uses the information from `Requires at least`, `Requires PHP` and `Requires Plugins` headers
[1126] Fix | Delete
* defined in the plugin's main PHP file.
[1127] Fix | Delete
*
[1128] Fix | Delete
* @since 5.2.0
[1129] Fix | Delete
* @since 5.3.0 Added support for reading the headers from the plugin's
[1130] Fix | Delete
* main PHP file, with `readme.txt` as a fallback.
[1131] Fix | Delete
* @since 5.8.0 Removed support for using `readme.txt` as a fallback.
[1132] Fix | Delete
* @since 6.5.0 Added support for the 'Requires Plugins' header.
[1133] Fix | Delete
*
[1134] Fix | Delete
* @param string $plugin Path to the plugin file relative to the plugins directory.
[1135] Fix | Delete
* @return true|WP_Error True if requirements are met, WP_Error on failure.
[1136] Fix | Delete
*/
[1137] Fix | Delete
function validate_plugin_requirements( $plugin ) {
[1138] Fix | Delete
$plugin_headers = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
[1139] Fix | Delete
[1140] Fix | Delete
$requirements = array(
[1141] Fix | Delete
'requires' => ! empty( $plugin_headers['RequiresWP'] ) ? $plugin_headers['RequiresWP'] : '',
[1142] Fix | Delete
'requires_php' => ! empty( $plugin_headers['RequiresPHP'] ) ? $plugin_headers['RequiresPHP'] : '',
[1143] Fix | Delete
'requires_plugins' => ! empty( $plugin_headers['RequiresPlugins'] ) ? $plugin_headers['RequiresPlugins'] : '',
[1144] Fix | Delete
);
[1145] Fix | Delete
[1146] Fix | Delete
$compatible_wp = is_wp_version_compatible( $requirements['requires'] );
[1147] Fix | Delete
$compatible_php = is_php_version_compatible( $requirements['requires_php'] );
[1148] Fix | Delete
[1149] Fix | Delete
$php_update_message = '</p><p>' . sprintf(
[1150] Fix | Delete
/* translators: %s: URL to Update PHP page. */
[1151] Fix | Delete
__( '<a href="%s">Learn more about updating PHP</a>.' ),
[1152] Fix | Delete
esc_url( wp_get_update_php_url() )
[1153] Fix | Delete
);
[1154] Fix | Delete
[1155] Fix | Delete
$annotation = wp_get_update_php_annotation();
[1156] Fix | Delete
[1157] Fix | Delete
if ( $annotation ) {
[1158] Fix | Delete
$php_update_message .= '</p><p><em>' . $annotation . '</em>';
[1159] Fix | Delete
}
[1160] Fix | Delete
[1161] Fix | Delete
if ( ! $compatible_wp && ! $compatible_php ) {
[1162] Fix | Delete
return new WP_Error(
[1163] Fix | Delete
'plugin_wp_php_incompatible',
[1164] Fix | Delete
'<p>' . sprintf(
[1165] Fix | Delete
/* translators: 1: Current WordPress version, 2: Current PHP version, 3: Plugin name, 4: Required WordPress version, 5: Required PHP version. */
[1166] Fix | Delete
_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' ),
[1167] Fix | Delete
get_bloginfo( 'version' ),
[1168] Fix | Delete
PHP_VERSION,
[1169] Fix | Delete
$plugin_headers['Name'],
[1170] Fix | Delete
$requirements['requires'],
[1171] Fix | Delete
$requirements['requires_php']
[1172] Fix | Delete
) . $php_update_message . '</p>'
[1173] Fix | Delete
);
[1174] Fix | Delete
} elseif ( ! $compatible_php ) {
[1175] Fix | Delete
return new WP_Error(
[1176] Fix | Delete
'plugin_php_incompatible',
[1177] Fix | Delete
'<p>' . sprintf(
[1178] Fix | Delete
/* translators: 1: Current PHP version, 2: Plugin name, 3: Required PHP version. */
[1179] Fix | Delete
_x( '<strong>Error:</strong> Current PHP version (%1$s) does not meet minimum requirements for %2$s. The plugin requires PHP %3$s.', 'plugin' ),
[1180] Fix | Delete
PHP_VERSION,
[1181] Fix | Delete
$plugin_headers['Name'],
[1182] Fix | Delete
$requirements['requires_php']
[1183] Fix | Delete
) . $php_update_message . '</p>'
[1184] Fix | Delete
);
[1185] Fix | Delete
} elseif ( ! $compatible_wp ) {
[1186] Fix | Delete
return new WP_Error(
[1187] Fix | Delete
'plugin_wp_incompatible',
[1188] Fix | Delete
'<p>' . sprintf(
[1189] Fix | Delete
/* translators: 1: Current WordPress version, 2: Plugin name, 3: Required WordPress version. */
[1190] Fix | Delete
_x( '<strong>Error:</strong> Current WordPress version (%1$s) does not meet minimum requirements for %2$s. The plugin requires WordPress %3$s.', 'plugin' ),
[1191] Fix | Delete
get_bloginfo( 'version' ),
[1192] Fix | Delete
$plugin_headers['Name'],
[1193] Fix | Delete
$requirements['requires']
[1194] Fix | Delete
) . '</p>'
[1195] Fix | Delete
);
[1196] Fix | Delete
}
[1197] Fix | Delete
[1198] Fix | Delete
WP_Plugin_Dependencies::initialize();
[1199] Fix | Delete
[1200] Fix | Delete
if ( WP_Plugin_Dependencies::has_unmet_dependencies( $plugin ) ) {
[1201] Fix | Delete
$dependency_names = WP_Plugin_Dependencies::get_dependency_names( $plugin );
[1202] Fix | Delete
$unmet_dependencies = array();
[1203] Fix | Delete
$unmet_dependency_names = array();
[1204] Fix | Delete
[1205] Fix | Delete
foreach ( $dependency_names as $dependency => $dependency_name ) {
[1206] Fix | Delete
$dependency_file = WP_Plugin_Dependencies::get_dependency_filepath( $dependency );
[1207] Fix | Delete
[1208] Fix | Delete
if ( false === $dependency_file ) {
[1209] Fix | Delete
$unmet_dependencies['not_installed'][ $dependency ] = $dependency_name;
[1210] Fix | Delete
$unmet_dependency_names[] = $dependency_name;
[1211] Fix | Delete
} elseif ( is_plugin_inactive( $dependency_file ) ) {
[1212] Fix | Delete
$unmet_dependencies['inactive'][ $dependency ] = $dependency_name;
[1213] Fix | Delete
$unmet_dependency_names[] = $dependency_name;
[1214] Fix | Delete
}
[1215] Fix | Delete
}
[1216] Fix | Delete
[1217] Fix | Delete
$error_message = sprintf(
[1218] Fix | Delete
/* translators: 1: Plugin name, 2: Number of plugins, 3: A comma-separated list of plugin names. */
[1219] Fix | Delete
_n(
[1220] Fix | Delete
'<strong>Error:</strong> %1$s requires %2$d plugin to be installed and activated: %3$s.',
[1221] Fix | Delete
'<strong>Error:</strong> %1$s requires %2$d plugins to be installed and activated: %3$s.',
[1222] Fix | Delete
count( $unmet_dependency_names )
[1223] Fix | Delete
),
[1224] Fix | Delete
$plugin_headers['Name'],
[1225] Fix | Delete
count( $unmet_dependency_names ),
[1226] Fix | Delete
implode( wp_get_list_item_separator(), $unmet_dependency_names )
[1227] Fix | Delete
);
[1228] Fix | Delete
[1229] Fix | Delete
if ( is_multisite() ) {
[1230] Fix | Delete
if ( current_user_can( 'manage_network_plugins' ) ) {
[1231] Fix | Delete
$error_message .= ' ' . sprintf(
[1232] Fix | Delete
/* translators: %s: Link to the plugins page. */
[1233] Fix | Delete
__( '<a href="%s">Manage plugins</a>.' ),
[1234] Fix | Delete
esc_url( network_admin_url( 'plugins.php' ) )
[1235] Fix | Delete
);
[1236] Fix | Delete
} else {
[1237] Fix | Delete
$error_message .= ' ' . __( 'Please contact your network administrator.' );
[1238] Fix | Delete
}
[1239] Fix | Delete
} else {
[1240] Fix | Delete
$error_message .= ' ' . sprintf(
[1241] Fix | Delete
/* translators: %s: Link to the plugins page. */
[1242] Fix | Delete
__( '<a href="%s">Manage plugins</a>.' ),
[1243] Fix | Delete
esc_url( admin_url( 'plugins.php' ) )
[1244] Fix | Delete
);
[1245] Fix | Delete
}
[1246] Fix | Delete
[1247] Fix | Delete
return new WP_Error(
[1248] Fix | Delete
'plugin_missing_dependencies',
[1249] Fix | Delete
"<p>{$error_message}</p>",
[1250] Fix | Delete
$unmet_dependencies
[1251] Fix | Delete
);
[1252] Fix | Delete
}
[1253] Fix | Delete
[1254] Fix | Delete
return true;
[1255] Fix | Delete
}
[1256] Fix | Delete
[1257] Fix | Delete
/**
[1258] Fix | Delete
* Determines whether the plugin can be uninstalled.
[1259] Fix | Delete
*
[1260] Fix | Delete
* @since 2.7.0
[1261] Fix | Delete
*
[1262] Fix | Delete
* @param string $plugin Path to the plugin file relative to the plugins directory.
[1263] Fix | Delete
* @return bool Whether plugin can be uninstalled.
[1264] Fix | Delete
*/
[1265] Fix | Delete
function is_uninstallable_plugin( $plugin ) {
[1266] Fix | Delete
$file = plugin_basename( $plugin );
[1267] Fix | Delete
[1268] Fix | Delete
$uninstallable_plugins = (array) get_option( 'uninstall_plugins' );
[1269] Fix | Delete
if ( isset( $uninstallable_plugins[ $file ] ) || file_exists( WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php' ) ) {
[1270] Fix | Delete
return true;
[1271] Fix | Delete
}
[1272] Fix | Delete
[1273] Fix | Delete
return false;
[1274] Fix | Delete
}
[1275] Fix | Delete
[1276] Fix | Delete
/**
[1277] Fix | Delete
* Uninstalls a single plugin.
[1278] Fix | Delete
*
[1279] Fix | Delete
* Calls the uninstall hook, if it is available.
[1280] Fix | Delete
*
[1281] Fix | Delete
* @since 2.7.0
[1282] Fix | Delete
*
[1283] Fix | Delete
* @param string $plugin Path to the plugin file relative to the plugins directory.
[1284] Fix | Delete
* @return true|void True if a plugin's uninstall.php file has been found and included.
[1285] Fix | Delete
* Void otherwise.
[1286] Fix | Delete
*/
[1287] Fix | Delete
function uninstall_plugin( $plugin ) {
[1288] Fix | Delete
$file = plugin_basename( $plugin );
[1289] Fix | Delete
[1290] Fix | Delete
$uninstallable_plugins = (array) get_option( 'uninstall_plugins' );
[1291] Fix | Delete
[1292] Fix | Delete
/**
[1293] Fix | Delete
* Fires in uninstall_plugin() immediately before the plugin is uninstalled.
[1294] Fix | Delete
*
[1295] Fix | Delete
* @since 4.5.0
[1296] Fix | Delete
*
[1297] Fix | Delete
* @param string $plugin Path to the plugin file relative to the plugins directory.
[1298] Fix | Delete
* @param array $uninstallable_plugins Uninstallable plugins.
[1299] Fix | Delete
*/
[1300] Fix | Delete
do_action( 'pre_uninstall_plugin', $plugin, $uninstallable_plugins );
[1301] Fix | Delete
[1302] Fix | Delete
if ( file_exists( WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php' ) ) {
[1303] Fix | Delete
if ( isset( $uninstallable_plugins[ $file ] ) ) {
[1304] Fix | Delete
unset( $uninstallable_plugins[ $file ] );
[1305] Fix | Delete
update_option( 'uninstall_plugins', $uninstallable_plugins );
[1306] Fix | Delete
}
[1307] Fix | Delete
unset( $uninstallable_plugins );
[1308] Fix | Delete
[1309] Fix | Delete
define( 'WP_UNINSTALL_PLUGIN', $file );
[1310] Fix | Delete
[1311] Fix | Delete
wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $file );
[1312] Fix | Delete
include_once WP_PLUGIN_DIR . '/' . dirname( $file ) . '/uninstall.php';
[1313] Fix | Delete
[1314] Fix | Delete
return true;
[1315] Fix | Delete
}
[1316] Fix | Delete
[1317] Fix | Delete
if ( isset( $uninstallable_plugins[ $file ] ) ) {
[1318] Fix | Delete
$callable = $uninstallable_plugins[ $file ];
[1319] Fix | Delete
unset( $uninstallable_plugins[ $file ] );
[1320] Fix | Delete
update_option( 'uninstall_plugins', $uninstallable_plugins );
[1321] Fix | Delete
unset( $uninstallable_plugins );
[1322] Fix | Delete
[1323] Fix | Delete
wp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $file );
[1324] Fix | Delete
include_once WP_PLUGIN_DIR . '/' . $file;
[1325] Fix | Delete
[1326] Fix | Delete
add_action( "uninstall_{$file}", $callable );
[1327] Fix | Delete
[1328] Fix | Delete
/**
[1329] Fix | Delete
* Fires in uninstall_plugin() once the plugin has been uninstalled.
[1330] Fix | Delete
*
[1331] Fix | Delete
* The action concatenates the 'uninstall_' prefix with the basename of the
[1332] Fix | Delete
* plugin passed to uninstall_plugin() to create a dynamically-named action.
[1333] Fix | Delete
*
[1334] Fix | Delete
* @since 2.7.0
[1335] Fix | Delete
*/
[1336] Fix | Delete
do_action( "uninstall_{$file}" );
[1337] Fix | Delete
}
[1338] Fix | Delete
}
[1339] Fix | Delete
[1340] Fix | Delete
//
[1341] Fix | Delete
// Menu.
[1342] Fix | Delete
//
[1343] Fix | Delete
[1344] Fix | Delete
/**
[1345] Fix | Delete
* Adds a top-level menu page.
[1346] Fix | Delete
*
[1347] Fix | Delete
* This function takes a capability which will be used to determine whether
[1348] Fix | Delete
* or not a page is included in the menu.
[1349] Fix | Delete
*
[1350] Fix | Delete
* The function which is hooked in to handle the output of the page must check
[1351] Fix | Delete
* that the user has the required capability as well.
[1352] Fix | Delete
*
[1353] Fix | Delete
* @since 1.5.0
[1354] Fix | Delete
*
[1355] Fix | Delete
* @global array $menu
[1356] Fix | Delete
* @global array $admin_page_hooks
[1357] Fix | Delete
* @global array $_registered_pages
[1358] Fix | Delete
* @global array $_parent_pages
[1359] Fix | Delete
*
[1360] Fix | Delete
* @param string $page_title The text to be displayed in the title tags of the page when the menu is selected.
[1361] Fix | Delete
* @param string $menu_title The text to be used for the menu.
[1362] Fix | Delete
* @param string $capability The capability required for this menu to be displayed to the user.
[1363] Fix | Delete
* @param string $menu_slug The slug name to refer to this menu by. Should be unique for this menu page and only
[1364] Fix | Delete
* include lowercase alphanumeric, dashes, and underscores characters to be compatible
[1365] Fix | Delete
* with sanitize_key().
[1366] Fix | Delete
* @param callable $callback Optional. The function to be called to output the content for this page.
[1367] Fix | Delete
* @param string $icon_url Optional. The URL to the icon to be used for this menu.
[1368] Fix | Delete
* * Pass a base64-encoded SVG using a data URI, which will be colored to match
[1369] Fix | Delete
* the color scheme. This should begin with 'data:image/svg+xml;base64,'.
[1370] Fix | Delete
* * Pass the name of a Dashicons helper class to use a font icon,
[1371] Fix | Delete
* e.g. 'dashicons-chart-pie'.
[1372] Fix | Delete
* * Pass 'none' to leave div.wp-menu-image empty so an icon can be added via CSS.
[1373] Fix | Delete
* @param int|float $position Optional. The position in the menu order this item should appear.
[1374] Fix | Delete
* @return string The resulting page's hook_suffix.
[1375] Fix | Delete
*/
[1376] Fix | Delete
function add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $icon_url = '', $position = null ) {
[1377] Fix | Delete
global $menu, $admin_page_hooks, $_registered_pages, $_parent_pages;
[1378] Fix | Delete
[1379] Fix | Delete
$menu_slug = plugin_basename( $menu_slug );
[1380] Fix | Delete
[1381] Fix | Delete
$admin_page_hooks[ $menu_slug ] = sanitize_title( $menu_title );
[1382] Fix | Delete
[1383] Fix | Delete
$hookname = get_plugin_page_hookname( $menu_slug, '' );
[1384] Fix | Delete
[1385] Fix | Delete
if ( ! empty( $callback ) && ! empty( $hookname ) && current_user_can( $capability ) ) {
[1386] Fix | Delete
add_action( $hookname, $callback );
[1387] Fix | Delete
}
[1388] Fix | Delete
[1389] Fix | Delete
if ( empty( $icon_url ) ) {
[1390] Fix | Delete
$icon_url = 'dashicons-admin-generic';
[1391] Fix | Delete
$icon_class = 'menu-icon-generic ';
[1392] Fix | Delete
} else {
[1393] Fix | Delete
$icon_url = set_url_scheme( $icon_url );
[1394] Fix | Delete
$icon_class = '';
[1395] Fix | Delete
}
[1396] Fix | Delete
[1397] Fix | Delete
$new_menu = array( $menu_title, $capability, $menu_slug, $page_title, 'menu-top ' . $icon_class . $hookname, $hookname, $icon_url );
[1398] Fix | Delete
[1399] Fix | Delete
if ( null !== $position && ! is_numeric( $position ) ) {
[1400] Fix | Delete
_doing_it_wrong(
[1401] Fix | Delete
__FUNCTION__,
[1402] Fix | Delete
sprintf(
[1403] Fix | Delete
/* translators: %s: add_menu_page() */
[1404] Fix | Delete
__( 'The seventh parameter passed to %s should be numeric representing menu position.' ),
[1405] Fix | Delete
'<code>add_menu_page()</code>'
[1406] Fix | Delete
),
[1407] Fix | Delete
'6.0.0'
[1408] Fix | Delete
);
[1409] Fix | Delete
$position = null;
[1410] Fix | Delete
}
[1411] Fix | Delete
[1412] Fix | Delete
if ( null === $position || ! is_numeric( $position ) ) {
[1413] Fix | Delete
$menu[] = $new_menu;
[1414] Fix | Delete
} elseif ( isset( $menu[ (string) $position ] ) ) {
[1415] Fix | Delete
$collision_avoider = base_convert( substr( md5( $menu_slug . $menu_title ), -4 ), 16, 10 ) * 0.00001;
[1416] Fix | Delete
$position = (string) ( $position + $collision_avoider );
[1417] Fix | Delete
$menu[ $position ] = $new_menu;
[1418] Fix | Delete
} else {
[1419] Fix | Delete
/*
[1420] Fix | Delete
* Cast menu position to a string.
[1421] Fix | Delete
*
[1422] Fix | Delete
* This allows for floats to be passed as the position. PHP will normally cast a float to an
[1423] Fix | Delete
* integer value, this ensures the float retains its mantissa (positive fractional part).
[1424] Fix | Delete
*
[1425] Fix | Delete
* A string containing an integer value, eg "10", is treated as a numeric index.
[1426] Fix | Delete
*/
[1427] Fix | Delete
$position = (string) $position;
[1428] Fix | Delete
$menu[ $position ] = $new_menu;
[1429] Fix | Delete
}
[1430] Fix | Delete
[1431] Fix | Delete
$_registered_pages[ $hookname ] = true;
[1432] Fix | Delete
[1433] Fix | Delete
// No parent as top level.
[1434] Fix | Delete
$_parent_pages[ $menu_slug ] = false;
[1435] Fix | Delete
[1436] Fix | Delete
return $hookname;
[1437] Fix | Delete
}
[1438] Fix | Delete
[1439] Fix | Delete
/**
[1440] Fix | Delete
* Adds a submenu page.
[1441] Fix | Delete
*
[1442] Fix | Delete
* This function takes a capability which will be used to determine whether
[1443] Fix | Delete
* or not a page is included in the menu.
[1444] Fix | Delete
*
[1445] Fix | Delete
* The function which is hooked in to handle the output of the page must check
[1446] Fix | Delete
* that the user has the required capability as well.
[1447] Fix | Delete
*
[1448] Fix | Delete
* @since 1.5.0
[1449] Fix | Delete
* @since 5.3.0 Added the `$position` parameter.
[1450] Fix | Delete
*
[1451] Fix | Delete
* @global array $submenu
[1452] Fix | Delete
* @global array $menu
[1453] Fix | Delete
* @global array $_wp_real_parent_file
[1454] Fix | Delete
* @global bool $_wp_submenu_nopriv
[1455] Fix | Delete
* @global array $_registered_pages
[1456] Fix | Delete
* @global array $_parent_pages
[1457] Fix | Delete
*
[1458] Fix | Delete
* @param string $parent_slug The slug name for the parent menu (or the file name of a standard
[1459] Fix | Delete
* WordPress admin page).
[1460] Fix | Delete
* @param string $page_title The text to be displayed in the title tags of the page when the menu
[1461] Fix | Delete
* is selected.
[1462] Fix | Delete
* @param string $menu_title The text to be used for the menu.
[1463] Fix | Delete
* @param string $capability The capability required for this menu to be displayed to the user.
[1464] Fix | Delete
* @param string $menu_slug The slug name to refer to this menu by. Should be unique for this menu
[1465] Fix | Delete
* and only include lowercase alphanumeric, dashes, and underscores characters
[1466] Fix | Delete
* to be compatible with sanitize_key().
[1467] Fix | Delete
* @param callable $callback Optional. The function to be called to output the content for this page.
[1468] Fix | Delete
* @param int|float $position Optional. The position in the menu order this item should appear.
[1469] Fix | Delete
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
[1470] Fix | Delete
*/
[1471] Fix | Delete
function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $callback = '', $position = null ) {
[1472] Fix | Delete
global $submenu, $menu, $_wp_real_parent_file, $_wp_submenu_nopriv,
[1473] Fix | Delete
$_registered_pages, $_parent_pages;
[1474] Fix | Delete
[1475] Fix | Delete
$menu_slug = plugin_basename( $menu_slug );
[1476] Fix | Delete
$parent_slug = plugin_basename( $parent_slug );
[1477] Fix | Delete
[1478] Fix | Delete
if ( isset( $_wp_real_parent_file[ $parent_slug ] ) ) {
[1479] Fix | Delete
$parent_slug = $_wp_real_parent_file[ $parent_slug ];
[1480] Fix | Delete
}
[1481] Fix | Delete
[1482] Fix | Delete
if ( ! current_user_can( $capability ) ) {
[1483] Fix | Delete
$_wp_submenu_nopriv[ $parent_slug ][ $menu_slug ] = true;
[1484] Fix | Delete
return false;
[1485] Fix | Delete
}
[1486] Fix | Delete
[1487] Fix | Delete
/*
[1488] Fix | Delete
* If the parent doesn't already have a submenu, add a link to the parent
[1489] Fix | Delete
* as the first item in the submenu. If the submenu file is the same as the
[1490] Fix | Delete
* parent file someone is trying to link back to the parent manually. In
[1491] Fix | Delete
* this case, don't automatically add a link back to avoid duplication.
[1492] Fix | Delete
*/
[1493] Fix | Delete
if ( ! isset( $submenu[ $parent_slug ] ) && $menu_slug !== $parent_slug ) {
[1494] Fix | Delete
foreach ( (array) $menu as $parent_menu ) {
[1495] Fix | Delete
if ( $parent_menu[2] === $parent_slug && current_user_can( $parent_menu[1] ) ) {
[1496] Fix | Delete
$submenu[ $parent_slug ][] = array_slice( $parent_menu, 0, 4 );
[1497] Fix | Delete
}
[1498] Fix | Delete
}
[1499] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function