Добавить меню и подменю в админке с URL вместо slug?
Я использую эту функцию и хук:
function mysite_admin_menu()
{
add_menu_page( 'Categories', 'Категории', 'administrator', 'categories', 'a_function' );
add_submenu_page( 'categories', 'Manage', 'Управление', 'administrator', 'xxx', 'a_function' );
remove_submenu_page('categories','categories');
}
add_action( 'admin_menu', 'mysite_admin_menu' );
Это отображает то, что мне нужно: меню с подменю в левой панели админки.
Проблема в том, что подменю ведет на страницу: admin.php?page=xxx
.
Как мне сделать ссылку на URL вида edit-tags.php?taxonomy=category
?
Если я заменю slug в add_submenu_page
на относительный URL, ссылка будет вести на
admin.php?page=edit-tags.php?taxonomy=category
.
Что бы я ни делал, я всегда получаю admin.php?page=...
, что не то, что мне нужно.

Это старый пост, но разве нельзя просто использовать глобальные переменные WordPress $menu
и/или $submenu
, как предложил Олег в пункте 2.
Если сомневаетесь, скопируйте WordPress:
Например, чтобы добавить ссылку, это должно сработать:
function add_external_link_admin_submenu() {
global $submenu;
$permalink = admin_url( 'edit-tags.php' ).'?taxonomy=category';
$submenu['options-general.php'][] = array( 'Управление', 'manage_options', $permalink );
}
add_action('admin_menu', 'add_external_link_admin_submenu');
Вы можете заменить $permalink = ...
на что угодно
Так что это тоже должно работать:
$permalink = 'http://www.example.com';
Также рекомендуется не использовать 'administrator' (хотя я тоже его использую). В любом случае, прочитайте этот тикет для альтернативных решений.

Я не рекомендую вам этого делать.
Предположим, что ваш префикс для admin.php
- это _trigger_me_
Подменю
<?php function _clean_url_to_repalce_admin_menu($url, $original_url, $_context){ if ($url == 'admin.php?page=_trigger_me_'){ remove_filter('clean_url', '_clean_url_to_repalce_admin_menu', 10); //return admin_url('someotherpage.php); return 'http://google.com/'; } } if (is_admin()) add_filter('clean_url', '_clean_url_to_repalce_admin_menu', 10, 3);
Главное меню
<?php function custom_admin_menu_action_hook(){ global $menu; foreach($menu as $k=>$item){ if ($item[2] == '_trigger_me_'){ $menu[$k][2] = 'http://google.com'; } } } add_action('admin_menu', 'custom_admin_menu_action_hook', 100);
Я называю оба примера "хаками". Их можно реализовать, но лучше так не делать.
Обновление.
Если вас устраивает редирект =)
<?php
$hook = add_submenu_page($parent, $title, $menu_title, 'manage_option', 'callback');
add_action("load-{$hook}", create_function('','
header("Location:", admin_url("someurl.php?blahblahblah"));
exit;
'));
Если вы хотите заменить это страницей таксономии (edit-tags.php
)
<?php
add_action('admin_menu', 'admin_menu_edit_tags_page');
function admin_menu_edit_tags_page(){
// установите $YOURPARENTSLUG как родительский слаг вашего пункта меню (родитель вашего меню)
// manage_tags на manage_terms для вашей таксономии (можно увидеть при var_dump($wp_taxonomies[$taxonomyyouwant]));
add_submenu_page($YOURPARENTSLUG, 'menu', 'title', 'manage_tags', 'edit-tags.php?taxonomy=taxonomy');
}

Если в вашем подменю отсутствует префикс admin.php?page=
, вам следует сначала зарегистрировать родительское меню, а затем подменю.
add_action( 'admin_menu', function() {
// Сначала родительское меню
add_menu_page( 'Заголовок страницы', 'Заголовок меню', 'права_доступа', 'родительский-слаг', 'функция_обратного_вызова' );
// Затем подменю
add_submenu_page( 'родительский-слаг', 'Заголовок страницы подменю', 'Заголовок подменю', 'права_доступа', 'слаг', 'функция_обратного_вызова' );
} );
В противном случае ссылка будет состоять только из слага.

Спасибо, Олег, твой скрипт работает, но ломает интерфейс админки (по какой-то причине пропадают все фоновые цвета и изображения).
Но если уж идти этим путем, я могу сделать так:
function changeUrl()
{
$pageURL = 'http://'.$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
if ($pageURL == 'http://www.mysite.com/wp-admin/admin.php?page=xxxx')
{
header ('location:http://www.mysite.com/wp-admin/edit-tags.php?taxonomy=category');
}
}
add_action( 'admin_menu', 'changeUrl' );
Мне кажется странным, что нет простого способа привязать подменю к произвольному URL. Такой способ перенаправления выглядит неряшливо... но он работает.

Хотя это старая проблема, я хотел бы предложить для рассмотрения этот код:
function mysite_admin_menu()
{
add_menu_page( 'Categories', 'Категории', 'administrator', 'categories', 'a_function' );
add_submenu_page( 'categories', 'Manage', 'Управление', 'administrator', 'manage_categories', 'mysite_manage_categories' );
remove_submenu_page('categories','categories');
}
add_action( 'admin_menu', 'mysite_admin_menu' );
function mysite_manage_categories()
{
?><script>window.location = "<?php echo admin_url('edit-tags.php?taxonomy=category'); ?>";</script><?php
}
Он использует JavaScript-редирект вместо создания другого add_action для перенаправления через HTTP.
