# add_submenu_page()

URL: https://chugunov.pro/api-wordpress/functions/add_submenu_page/
Проверено на WordPress 6.9, обновлено 06.08.2026.
Источник: независимый русскоязычный справочник chugunov.pro. Не является официальной документацией WordPress.

Тип: функция.
Появился в версии: 1.5.0.

## Сигнатура

```php
add_submenu_page( string $parent_slug, string $page_title, string $menu_title, string $capability, string $menu_slug, callable $callback = '', int|float $position = null ): string|false
```

## Описание

Принимает право доступа, которое используется для определения того, включается ли страница в меню.
Функция, подключённая для вывода содержимого страницы, также должна проверять, что пользователь обладает необходимым правом доступа.

## Параметры

- `$parent_slug` `string` — обязательный. Слаг родительского меню (или имя файла стандартной страницы административной части WordPress).
- `$page_title` `string` — обязательный. Текст, отображаемый в тегах заголовка страницы при выборе пункта меню.
- `$menu_title` `string` — обязательный. Текст, используемый для пункта меню.
- `$capability` `string` — обязательный. Право доступа, необходимое для отображения этого меню пользователю.
- `$menu_slug` `string` — обязательный. Слаг, по которому будет обозначаться это меню. Должен быть уникальным для этого меню и содержать только строчные буквенно-цифровые символы, дефисы и подчёркивания для совместимости с sanitize_key() .
- `$callback` `callable` — необязательный, по умолчанию `''`. Функция, вызываемая для вывода содержимого этой страницы.
- `$position` `int|float` — необязательный, по умолчанию `null`. Позиция в порядке меню, на которой должен появиться этот пункт.

## Возвращаемое значение

`string|false`

## Исходный код

Файл: `wp-admin/includes/plugin.php:1486`

```php
function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $callback = '', $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 the parent doesn't already have a submenu, add a link to the parent
	 * as the first item in the submenu. If the submenu file is the same as the
	 * parent file someone is trying to link back to the parent manually. In
	 * this case, don't automatically add a link back to avoid duplication.
	 */
	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 ( null !== $position && ! is_numeric( $position ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: add_submenu_page() */
				__( 'The seventh parameter passed to %s should be numeric representing menu position.' ),
				'<code>add_submenu_page()</code>'
			),
			'5.3.0'
		);
		$position = null;
	}

	if (
		null === $position ||
		( ! isset( $submenu[ $parent_slug ] ) || $position >= count( $submenu[ $parent_slug ] ) )
	) {
		$submenu[ $parent_slug ][] = $new_sub_menu;
	} else {
		// Test for a negative position.
		$position = max( $position, 0 );
		if ( 0 === $position ) {
			// For negative or `0` positions, prepend the submenu.
			array_unshift( $submenu[ $parent_slug ], $new_sub_menu );
		} else {
			$position = absint( $position );
			// Grab all of the items before the insertion point.
			$before_items = array_slice( $submenu[ $parent_slug ], 0, $position, true );
			// Grab all of the items after the insertion point.
			$after_items = array_slice( $submenu[ $parent_slug ], $position, null, true );
			// Add the new item.
			$before_items[] = $new_sub_menu;
			// Merge the items.
			$submenu[ $parent_slug ] = array_merge( $before_items, $after_items );
		}
	}

	// Sort the parent array.
	ksort( $submenu[ $parent_slug ] );

	$hookname = get_plugin_page_hookname( $menu_slug, $parent_slug );
	if ( ! empty( $callback ) && ! empty( $hookname ) ) {
		add_action( $hookname, $callback );
	}

	$_registered_pages[ $hookname ] = true;

	/*
	 * Backward-compatibility for plugins using add_management_page().
	 * See wp-admin/admin.php for redirect from edit.php to tools.php.
	 */
	if ( 'tools.php' === $parent_slug ) {
		$_registered_pages[ get_plugin_page_hookname( $menu_slug, 'edit.php' ) ] = true;
	}

	// No parent as top level.
	$_parent_pages[ $menu_slug ] = $parent_slug;

	return $hookname;
}
```

## История изменений

- 5.3.0 — Added the $position parameter.
- 1.5.0 — Introduced.

## Связанные

Использует: [`get_plugin_page_hookname`](https://chugunov.pro/api-wordpress/functions/get_plugin_page_hookname/), [`plugin_basename`](https://chugunov.pro/api-wordpress/functions/plugin_basename/), [`current_user_can`](https://chugunov.pro/api-wordpress/functions/current_user_can/), [`__`](https://chugunov.pro/api-wordpress/functions/__/), [`_doing_it_wrong`](https://chugunov.pro/api-wordpress/functions/_doing_it_wrong/), [`absint`](https://chugunov.pro/api-wordpress/functions/absint/), [`add_action`](https://chugunov.pro/api-wordpress/functions/add_action/).
Используется в: [`_add_plugin_file_editor_to_tools`](https://chugunov.pro/api-wordpress/functions/_add_plugin_file_editor_to_tools/), [`add_management_page`](https://chugunov.pro/api-wordpress/functions/add_management_page/), [`add_options_page`](https://chugunov.pro/api-wordpress/functions/add_options_page/), [`add_theme_page`](https://chugunov.pro/api-wordpress/functions/add_theme_page/), [`add_plugins_page`](https://chugunov.pro/api-wordpress/functions/add_plugins_page/), [`add_users_page`](https://chugunov.pro/api-wordpress/functions/add_users_page/), [`add_dashboard_page`](https://chugunov.pro/api-wordpress/functions/add_dashboard_page/), [`add_posts_page`](https://chugunov.pro/api-wordpress/functions/add_posts_page/), [`add_media_page`](https://chugunov.pro/api-wordpress/functions/add_media_page/), [`add_links_page`](https://chugunov.pro/api-wordpress/functions/add_links_page/), [`add_pages_page`](https://chugunov.pro/api-wordpress/functions/add_pages_page/), [`add_comments_page`](https://chugunov.pro/api-wordpress/functions/add_comments_page/), [`_add_themes_utility_last`](https://chugunov.pro/api-wordpress/functions/_add_themes_utility_last/), [`_add_post_type_submenus`](https://chugunov.pro/api-wordpress/functions/_add_post_type_submenus/).

Оригинал в официальной документации: https://developer.wordpress.org/reference/functions/add_submenu_page/
