Я создаю плагин WordPress, и мне бы хотелось, чтобы страница редактирования была недоступна через подменю (потому что тогда элемент не будет указан).
Этот ресурс (http://codex.wordpress.org/Adding_Administration_Menus) показывает, как связать страницу администратора с функцией, но не делать это, не добавляя ее в качестве элемента меню.
Можно ли это сделать?
Спасибо!
Да, это может быть сделано (ну, технически, это будет больше похоже на регистрацию всего этого, а затем удаление элемента меню позже), но было бы проще (я думаю) проверить параметры в $_GET
супер-глобальный, чтобы указать, что пользователь хочет отредактировать определенный элемент.
Например, у вас может быть страница, в которой перечислены элементы для редактирования, и нажатие "edit" добавляет идентификатор элемента к текущему URL-адресу (строке запроса).
В функции, отображающей эту страницу, если ID определен, дайте им страницу для редактирования этого элемента.
В противном случае дайте им представление списка. Как это делают сообщения, страницы и другие пользовательские типы сообщений.
Лучшее решение здесь http://wordpress.org/support/topic/add-backend-page-without-menu-item используйте add_submenu_page с родительским slug = null
add_submenu_page с родительским slug = null
ИЛИ
add_submenu_page с заголовком меню = null
menu_title
имеет значение null
него не будет текста, но вы все равно можете щелкнуть по нему из-за заполнения.
Примечание. Это решение автоматически не устанавливает текущее меню и пункт подменю. Если вы хотите выделить конкретное меню как текущее, когда просматривается скрытая страница, см. мой другой ответ.
Из ответов, которые передо мной, вы можете видеть, что есть много способов сделать это. Однако есть другой способ, который, по моему мнению, может быть лучшим.
Загрузка страницы по-разному в зависимости от значения запроса $_GET
var является одним из параметров, но может быть, это не то, что ищут некоторые люди.
Предложения относительно add_submenu_page()
находятся на правильном пути, но у каждого из предыдущих предложений есть проблемы. Установка $menu_title
в null
не позволяет отображать пункт меню, а просто делает так, чтобы ссылка не содержала никакого текста. Ссылка все еще занимает некоторое место в меню, хотя, поэтому выглядит смешно. Установка $parent_slug
на null
не имеет этой проблемы, но я заметил, что страница HTML title
не отображает текст $page_title
.
Мое решение состояло в том, чтобы установить $parent_slug
в поддельный пул меню, например 'i_dont_exist'
. Элемент меню не будет отображаться, и при просмотре экрана администратора заголовок страницы будет заполнен правильно.
add_submenu_page(
'_doesnt_exist'
,__( 'Page title', 'textdomain' )
,''
,'manage_options'
,'menu_slug'
,'display_my_menu'
);
admin_url( 'options.php?page=menu_slug' )
'_doesnt_exist'
пустым значением, чтобы WordPress не сообщал, в каком меню добавить ссылку. Спасибо!
Да. Очень возможно сделать страницу недоступной через подменю или даже главное меню в панели администратора WP. См. Фрагмент кода ниже.
function myplugin_render_edit_page() {
// Code contains the UI for edit page.
}
/**
* Manage menu items and pages.
*/
function myplugin_register_admin_page() {
global $_registered_pages;
$menu_slug = plugin_basename('myplugin.php');
$hookname = get_plugin_page_hookname($menu_slug,'');
if (!empty($hookname)) {
add_action($hookname, 'myplugin_render_edit_page');
}
$_registered_pages[$hookname] = true;
}
add_action('admin_menu', 'myplugin_register_admin_page');
Надеюсь, это поможет.
используйте этот код для создания новой страницы без добавления в меню
add_action( 'admin_menu', 'register_newpage' );
function register_newpage(){
add_menu_page($appname, $appname, 'administrator','custompage', 'custom');
remove_menu_page('custom');
}
function custom()
{
echo "hai";
}
Я пробовал все предложения здесь, но с различными проблемами, связанными с каждым.
Код WordPress для add_submenu_page теперь дает правильный ответ, который должен использовать options.php в качестве родительского пула. Я попробовал трюк с использованием созданного имени, но которое дает ошибки разрешений, одинаково использующее нуль в разных местах, либо заставляет текст меню просто отсутствовать (но все еще доступен для клика), либо для названия браузера, который отсутствует.
Использование options.php работало, и я не видел никаких проблем в результате его использования.
Наконец-то я нашел способ сделать это, что не является уродливым взломом, не требует, чтобы JS выделил нужный пункт меню (и элемент подменю) и работает для регулярных меню, зарегистрированных плагинами (@Josh answer работает только для пользовательских типов сообщений).
По существу, вам просто нужно зарегистрировать свое подменю в обычном режиме, но затем подключитесь к фильтру 'submenu_file'
, чтобы отменить его регистрацию и, кроме того, также установить другой элемент подменю для выделения.
function so3902760_wp_admin_menu() {
// Register the parent menu.
add_menu_page(
__( 'Parent title', 'textdomain' )
, __( 'Parent', 'textdomain' )
, 'manage_options'
, 'my_parent_slug'
, 'display_my_menu'
);
// Register the hidden submenu.
add_submenu_page(
'my_parent_slug' // Use the parent slug as usual.
, __( 'Page title', 'textdomain' )
, ''
, 'manage_options'
, 'my_hidden_submenu'
, 'display_my_submenu'
);
}
add_action( 'admin_menu', 'so3902760_wp_admin_menu' );
function so3902760_wp_admin_submenu_filter( $submenu_file ) {
global $plugin_page;
$hidden_submenus = array(
'my_hidden_submenu' => true,
);
// Select another submenu item to highlight (optional).
if ( $plugin_page && isset( $hidden_submenus[ $plugin_page ] ) ) {
$submenu_file = 'submenu_to_highlight';
}
// Hide the submenu.
foreach ( $hidden_submenus as $submenu => $unused ) {
remove_submenu_page( 'my_parent_slug', $submenu );
}
return $submenu_file;
}
add_filter( 'submenu_file', 'so3902760_wp_admin_submenu_filter' );
submenu_file
фильтр submenu_file
обратно, так что он делал только remove_submenu_page( 'x_slug', 'y_slug' );return $submenu_file;
Использование add_submenu_page с родителем NULL определенно работает, однако, если вы хотите сохранить не связанную страницу, связанную с определенным меню (например, пользовательское меню типа сообщения), вы должны использовать вариацию ответа @Boopathi:
function my_hidden_submenu_page(){
//add the submenu page the usual way
add_submenu_page('edit.php?post_type=custom-type', 'My Page Title', 'My Page Title', 'manage_options', 'my-page-slug', 'my_page_callback');
//then remove it
remove_submenu_page('edit.php?post_type=custom-type','my-page-slug');
}
add_action('admin_menu', 'my_hidden_submenu_page');
Похоже, что два действия отменяют друг друга, однако remove_submenu_page не отменяет регистрацию функции обратного вызова; он просто удаляет ссылку.
Таким образом, когда кто-то просматривает вашу несвязанную страницу, правильное меню навигации (наше меню типа пользовательских сообщений в этом примере) будет по-прежнему отображаться как активное.
Я нахожу, что вы можете сделать это, повторно используя id вставки, например:
add_menu_page( 'User AS Packages', 'User AS', 'manage_options', 'myplugin/editaspackages.php', 'UserASPackages', '', 8);
add_menu_page( 'User ARP Packages', 'User ARP', 'manage_options', 'myplugin/editarppackages.php', 'UserARPPackages', '', 8);
add_menu_page( 'AS Packages', 'AS Packages', 'manage_options', 'myplugin/ars-s2.php', 'ARPPackages', '', 8);
Последние 3, использующие позицию 8, и последний, переопределяют два перед тем, чтобы два перед ними не отображались.
Одна из проблем, которые я обнаружил, просто добавляя null в качестве родительского пула для элемента подменю, заключается в том, что если вы просматриваете эту конкретную страницу в настоящее время, то подменю не будет отображаться (по крайней мере, это не для меня ( наряду с заголовком страницы, который не отображается).
То, что я сделал, это добавить пустой элемент span внутри заголовка меню и использовать jquery для перемещения родительских элементов и скрыть его.
get_admin_page_parent()
всегда переопределяет глобальный$parent_file
с исходным родителем, который являетсяnull
. Это происходит послеparent_file
фильтровparent_file
.get_admin_page_title()
возвращает пустую строку, если мы устанавливаем родительский слаг в значение null. Я предлагаю установить его на то, что, как мы знаем, мы не будем использовать в будущем, например, на хеш. Это не идеально как концепция, но она делает то, что мы хотим - ни один элемент не добавляется в меню, и мы все еще можем использоватьget_admin_page_title()
.