web-dev-qa-db-fra.com

Ajouter un menu et un sous-menu dans admin avec une URL au lieu de slug?

J'utilise cette fonction et accroche:

function mysite_admin_menu() 
{
  add_menu_page( 'Categories', 'Catégories', 'administrator', 'categories', 'a_function' );
  add_submenu_page( 'categories', 'Manage', 'Manage', 'administrator', 'xxx', 'a_function' );
  remove_submenu_page('categories','categories');
}
add_action( 'admin_menu', 'mysite_admin_menu' );

Il affiche ce dont j'ai besoin: un menu avec un sous-menu dans la barre de menus de gauche.

Le sous-menu mène à cette page: admin.php?page=xxx.

Comment puis-je créer un lien vers une URL telle que edit-tags.php?taxonomy=category?

Si j'échange le slug dans le add_submenu_page avec une URL relative, le lien mènera à admin.php?page=edit-tags.php?taxonomy=category.

Quoi que je fasse, je reçois toujours admin.php?page=..., ce qui n'est pas ce que je veux.

4
Baylock

Ceci est un ancien post, mais vous ne pouvez pas simplement utiliser wordpress $menu et/ou $submenu globals comme Oleg suggéré dans le numéro 2.

En cas de doute, copiez WordPress :

wordpress/wp-admin/menu.php

Par exemple, pour ajouter un lien, cela semble fonctionner:

function add_external_link_admin_submenu() {
    global $submenu;
    $permalink = admin_url( 'edit-tags.php' ).'?taxonomy=category';
    $submenu['options-general.php'][] = array( 'Manage', 'manage_options', $permalink );
}
add_action('admin_menu', 'add_external_link_admin_submenu');

Vous pouvez remplacer le $permalink = ... par n'importe quoi

Donc, cela devrait également fonctionner:

$permalink = 'http://www.example.com';

En outre, il est suggéré de ne pas utiliser "administrateur" (même si je l'utilise également. Quoi qu'il en soit, lisez ce ticket pour des solutions alternatives.

10
Bryan Willis

Je ne vous recommande pas de faire ça.

Supposons que votre préfixe pour admin.php est _trigger_me_

  1. Sous menu

    <?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. Menu principal

    <?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);
    

J'appelle les deux exemples "hacks". Ils peuvent le faire, mais il vaut mieux ne pas le faire.

mettre à jour.

si cas si satisfait avec redirection =)

<?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;
'));

au cas où vous voudriez le remplacer par la page taxonomie (edit-tags.php)

<?php
add_action('admin_menu', 'admin_menu_edit_tags_page');
function admin_menu_edit_tags_page(){
    // please set $YOURPARENTSLUG as parent slug of your menu item (parent of your menu)
    // manage_tags to manage_terms of your taxonomy capability (its visible whan you var_dump($wp_taxonomies[$taxonomyyouwant]));
    add_submenu_page($YOURPARENTSLUG, 'menu', 'title', 'manage_tags',  'edit-tags.php?taxonomy=taxonomy');
}
2
Butuzov

Merci Oleg, votre script fonctionne mais casse l'interface d'administration (les couleurs d'arrière-plan et les images disparaissent pour une raison quelconque).

Mais si je dois prendre cette route, je peux le faire à la place:

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' );

Il me semble curieux qu’il n’existe pas de moyen simple de relier un sous-menu à une URL. Ce type de redirection est désordonné ... mais cela fonctionne.

0
Baylock

Bien que ce soit un vieux problème, j'aimerais contribuer à l'examen de ce code:

function mysite_admin_menu() 
{
  add_menu_page( 'Categories', 'Catégories', 'administrator', 'categories', 'a_function' );
  add_submenu_page( 'categories', 'Manage', '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 
    }

il utilise la redirection javascript au lieu de créer un autre add_action pour rediriger via http.

0
barudo