add_submenu_page() WP 1.5.0

Додає дочірню сторінку (підрозділ) вказаного головного меню до адмін-панелі.

Вказавши мінімальні права користувача, можна обмежити доступ до меню.

Потрібно викликати через один із хуків:

Функція (параметр $function), яка відповідає за виведення контенту на сторінці, повинна перевіряти права користувача окремо і якщо потрібно блокувати доступ до контенту.

Якщо у вас з’являється помилка “Ви не маєте достатніх можливостей для використання цієї сторінки.” при спробі зайти на сторінку, це означає, що ви підключаєте функцію зарано, вішаєте функцію не на той хук. Потрібно використовувати хук admin_menu.

Не використовуйте __FILE__ для $menu_slug . Так ви отримаєте неробочий URL та дірку в захисті.

При написанні коду функції вказаної у параметрі $function , вам можливо потрібні будуть параметри, вказані для add_submenu_page() , наприклад $page_title . Отримати їх можна так:

  • $parent_slugget_admin_page_parent() ;
  • $page_titleget_admin_page_title() або просто використовуйте глобальну змінну $title ;
  • $menu_slug – глобальна змінна $plugin_page

Якщо потрібно додати пункт меню верхнього рівня, використовуйте add_menu_page() .

Читайте також: API налаштувань (опцій)

Основа для:
add_options_page() ,
add_theme_page()

Хуків немає.

Повертає

Строку|false. Назва хука, яка результує сторінки меню або false, якщо користувач не має прав доступу до меню.

Використання

add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function, $position );
$parent_slug
(рядок) (обов’язковий)

Назва (slug) батьківського меню до якого буде додано пункт або назву файлу адмін-сторінки WordPress.

Використовуйте NULL, щоб створити сторінку, яка не з’явиться в меню. Працює для мультисайту.

Приклади:

  • index.php– Консоль (Dashboard). Або функція add_dashboard_page() ;
  • edit.php– Пости (Posts). Або функція add_posts_page() ;
  • upload.php– Медіафайли (Media). Або функція add_media_page() ;
  • link-manager.php– Посилання (Links). Або функція add_links_page() ;
  • edit.php?post_type=page– Сторінки (Pages). Або функція add_pages_page() ;
  • edit-comments.php– Коментарі (Comments). Або функція add_comments_page() ;
  • edit.php?post_type=your_post_type– Довільні типи записів.
  • themes.php– Зовнішній вигляд (Appearance). Або функція add_theme_page() ;
  • plugins.php– Плагіни (Plugins). Або функція add_plugins_page() ;
  • users.php– Користувачі (Users). Або функція add_users_page() ;
  • tools.php– Інструменти (Tools). Або функція add_management_page() ;
  • options-general.php– Налаштування (Settings). Або функція: add_options_page()
  • settings.php– Налаштування (Settings) мережі сайтів у MU режимі.
$page_title
(рядок) (обов’язковий)
Текст, який буде використаний у тезі title на сторінці.
$menu_title
(рядок) (обов’язковий)
Текст, який буде використано як назву пункту меню.
$capability
(рядок) (обов’язковий)
Можливість користувача, щоб мати доступ до меню. Таблицю можливостей
дивіться тут . Цей параметр відповідає за доступ до сторінки цього пункту меню.
$menu_slug
(рядок) (обов’язковий)

Унікальна назва (slug), за якою потім можна звертатися до цього меню. Якщо потрібно дублювати батьківське меню, вкажіть $menu_slug так само, як у батьківського меню.

Ця назва буде використовуватись як значення параметра запиту page у посиланні на сторінку: ?page=название. Ця унікальна назва буде прив’язана до функції вказаної в наступному параметрі $function .

За неофіційною інформацією, в цей параметр можна додати шлях до файлу, який відповідає за сторінку цього пункту меню. Шлях повинен бути від каталогу плагінів: допустимо папка плагіна називається my-pluginфайл сторінки налаштувань options.php, тоді шлях до файлу буде такий: my-plugin/options.php.

$function
(рядок/масив)

Назва функції, яка буде викликатися, щоб вивести контент створюваної сторінки.
Два варіанти встановлення параметра:

  1. Якщо функція є способом класу, вона викликається за посиланням: array( $this, 'function_name' )чи статично: array( __CLASS__, 'function_name' ).
  2. У решті випадків вказуємо назву функції у вигляді рядка.

За замовчуванням: ”

$position
(число)
Позиція підпункту меню щодо інших підпунктів. Додано до WP 5.3.0.


Типово: null

Приклади

1

#1 Підменю для довільно створеного меню

Якщо ви намагаєтеся додати пункт меню до основного розділу, який ви створили самостійно за допомогою add_menu_page() , то перший пункт буде копією створеного пункту add_menu_page() . Це видно у всьому меню WordPress.

Якщо вам потрібен пункт підменю за таким сценарієм, то для початку потрібно створити дубль основного меню, а потім додати підменю:

add_menu_page('Основне додаткове меню', 'Моє основне меню', 'manage_options', 'my-top-level-slug');

add_submenu_page( 'my-top-level-slug', 'Основне додаткове меню', 'Моє основне меню', 'manage_options', 'my-top-level-slug');

add_submenu_page( 'my-top-level-slug', 'Моє підменю', 'Сторінка налаштувань мого підменю', 'manage_options', 'my-secondary-slug', 'page_callback_function');
0

#2 Додамо підменю в меню адмін-панелі “Інструменти” (tools):

// Додамо підменю в меню адмін-панелі "Інструменти" (tools):
add_action('admin_menu', 'register_my_custom_submenu_page');

function register_my_custom_submenu_page() {
	add_submenu_page(
		'tools.php',
		'Додаткова сторінка інструментів',
		'Назва інструменту',
		'manage_options',
		'my-custom-submenu-page',
		'my_custom_submenu_page_callback'
	);
}

function my_custom_submenu_page_callback() {
	// контент сторінки
	echo '<div class="wrap">';
		echo '<h2>'. get_admin_page_title() .'</h2>';
	echo '</div>';

}
0

#3 Ховаємо сторінку з меню, але вона все одно буде робочою

Щоб сховати посилання підменю з основного меню адмін-панелі, використовуйте перший параметр null або ‘options.php’:

// Ховаємо сторінку з меню, але вона все одно буде робочою
add_action('admin_menu', 'register_my_custom_submenu_page');
function register_my_custom_submenu_page(){
	add_submenu_page(
		null, //or 'options.php'
		'Довільна сторінка підменю',
		'Довільна сторінка підменю',
		'manage_options',
		'my-custom-submenu-page',
		'my_custom_submenu_page_callback'
	);
}
0

#4 Без зазначення функції сторінки налаштувань (неофіційно)

В офіційній документації цього немає. У параметрі $menu_slug можна вказати шлях до сторінки опцій від каталогу плагінів. У цьому випадку не потрібно вказувати функцію, яка відповідає за код сторінки налаштувань. Для сторінки установок у нас буде окремий файл. Припустимо наш файл сторінки налаштувань лежить у корені папки плагіна і називається options.php , тоді сторінка налаштувань плагіна реєструється так:

add_action( 'admin_menu', 'add_options_page');

function add_options_page(){

	add_submenu_page(
		'options-general.php',
		'Заголовок сторінки',
		'Назва пункту меню',
		'manage_options',
		basename(dirname(__FILE__)). '/options.php'
	);
}

Тут basename(dirname(__FILE__)).’/options.php’ дорівнює назва_папки_плагіна/options.php .

0

#5 Перевірка наявності пункту підменю

Дивіться приклади add_menu_page()

нотатки

  • Global. Масив. $submenu
  • Global. Масив. $menu
  • Global. Масив. $_wp_real_parent_file
  • Global. true | false. $_wp_submenu_nopriv
  • Global. Масив. $_registered_pages
  • Global. Масив. $_parent_pages

список змін

З версії 1.5.0Введено.
З версії 5.3.0Added the $position parameter.

Код add_submenu_page() WP 6.0.2

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;
	}

	/*
	 * Якщо 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 деякий is trying до link back to the parent manually. In
	 * Це означає, що не автоматично придбає 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 ] ) ) ||
	) {
		$submenu[ $parent_slug ][] = $new_sub_menu;
	} else {
		// Test for a negative position.
		$ position = max ($ position, 0);
		if ( 0 === $position ) {
			// Для negative or `0` positions, prepend the submenu.
			array_unshift( $submenu [ $parent_slug ], $ new_sub_menu );
		} else {
			// 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *