web-dev-qa-db-ja.com

スラッグの代わりにURLを使ってadminのメニューとサブメニューを追加しますか?

この関数を使ってフックします。

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

必要なものが表示されます。左側の管理メニューバーにサブメニューがあるメニューです。

問題は、サブメニューからadmin.php?page=xxxというページに移動したことです。

edit-tags.php?taxonomy=categoryのようなURLにリンクするにはどうすればいいですか?

add_submenu_page内のスラッグを相対URLに置き換えると、リンクはadmin.php?page=edit-tags.php?taxonomy=categoryにつながります。

私が何をしても、私はいつもadmin.php?page=...を受け取りますが、これは私が欲しいものではありません。

4
Baylock

これは古い投稿ですが、Olegのように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', 'manage_options', $permalink );
}
add_action('admin_menu', 'add_external_link_admin_submenu');

$permalink = ...を何かに置き換えることができます

だからこれも動作するはずです:

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

また、 'administrator'を使用しないことをお勧めします(私も使用していますが、とにかく、代わりの解決策として this ticket をお読みください)。

10
Bryan Willis

お勧めしません。

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

私は両方の例を「ハック」と呼びます。彼らはすることは可能だが、しないほうがよい。

更新。

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

これを分類ページで置き換えたい場合(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

Olegさん、あなたのスクリプトはうまくいきましたが、管理画面を壊していました(背景色と画像は、なんらかの理由で消えてしまいます)。

しかし、私がこの道を通らなければならない場合は、代わりにこれを行うことができます。

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にリンクする簡単な方法がないことは私には不思議に思えます。このようなリダイレクトは面倒です…でもうまくいきます。

0
Baylock

これは古い問題ですが、このコードを検討するために貢献したいと思います。

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 
    }

http経由でリダイレクトするadd_actionをもう1つ作成するのではなく、JavaScriptリダイレクトを使用します。

0
barudo