Добавить меню и подменю в админке с URL вместо slug?

30 янв. 2013 г., 15:06:10
Просмотры: 24K
Голосов: 6

Я использую эту функцию и хук:

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=..., что не то, что мне нужно.

1
Комментарии

смотри обновленный пример =)

Oleg Butuzov Oleg Butuzov
31 янв. 2013 г. 08:02:45
Все ответы на вопрос 5
0
13

Это старый пост, но разве нельзя просто использовать глобальные переменные WordPress $menu и/или $submenu, как предложил Олег в пункте 2.

Если сомневаетесь, скопируйте WordPress:

wordpress/wp-admin/menu.php

Например, чтобы добавить ссылку, это должно сработать:

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' (хотя я тоже его использую). В любом случае, прочитайте этот тикет для альтернативных решений.

26 июн. 2014 г. 08:22:56
0

Я не рекомендую вам этого делать.

Предположим, что ваш префикс для admin.php - это _trigger_me_

  1. Подменю

    <?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);
    
  2. Главное меню

    <?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');
}
30 янв. 2013 г. 16:06:07
0

Если в вашем подменю отсутствует префикс admin.php?page=, вам следует сначала зарегистрировать родительское меню, а затем подменю.

add_action( 'admin_menu', function() {

// Сначала родительское меню
add_menu_page( 'Заголовок страницы', 'Заголовок меню', 'права_доступа', 'родительский-слаг', 'функция_обратного_вызова' );

// Затем подменю
add_submenu_page( 'родительский-слаг', 'Заголовок страницы подменю', 'Заголовок подменю', 'права_доступа', 'слаг', 'функция_обратного_вызова' );

} );

В противном случае ссылка будет состоять только из слага.

18 июл. 2020 г. 22:29:47
0

Спасибо, Олег, твой скрипт работает, но ломает интерфейс админки (по какой-то причине пропадают все фоновые цвета и изображения).

Но если уж идти этим путем, я могу сделать так:

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. Такой способ перенаправления выглядит неряшливо... но он работает.

31 янв. 2013 г. 01:55:40
0

Хотя это старая проблема, я хотел бы предложить для рассмотрения этот код:

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.

25 февр. 2016 г. 01:45:56