管理メニューに任意のリンクを追加しますか?


20

WordPress管理メニューに任意のハイパーリンクを追加する方法はありますか(管理ダッシュボードにログインしたときに左側のメニューを意味します)?たとえば、リンクをGoogleに追加できますか?

私の特定のケースでは、作業中のWordpressテーマにスタイルガイドページを追加して、テーマでさまざまなHTML要素がどのようにスタイル設定されるかをユーザーに示し、さまざまなものをうまくスタイル設定する方法をデモします。

これは私がこれまでに持っているコードです(注:不完全です):functions.phpで、外観セクションに新しいメニュー項目を追加しました:

add_action('admin_menu', 'create_theme_style_page');

function create_theme_style_page() {
  add_theme_page('Theme Styleguide', 'Theme Styleguide', 'administrator', basename(__FILE__),'build_styleguide_page');
}

function build_styleguide_page() {
 echo "Not sure what goes here to redirect admin to a arbitrary url?";
}

build_styleguide_page()リダイレクトしようとするとheader()エラーが発生します(ヘッダー情報を変更できません)。

回答:


13

こんにちは@Tom

あなたの質問を正しく理解していれば、メニューにリンクを追加する方法を知っている必要はありません(すでに知っているようですが)代わりに、リンクを正しくリダイレ​​クトする方法を学ぶ必要がありますか?

管理メニュー項目から外部URLへのリダイレクト

その場合、メニュー項目関数を使用せずに、WordPressを「フック」して、おそらくHTTPヘッダー以外を出力しないようにする必要があります。呼び出し時の最初のフックは/wp-admin/themes.phpそうでafter_setup_themeあり、うまく機能しているように見えます。

「Menu Slug」を使用して、フックでテストできるようにします

しかし、それは、私たちににあなたの電話を修正する最初の必要動作するように取得するためadd_theme_pageadmin_menuフック/あなたのcreate_theme_style_page()機能を。5番目のパラメーター(adminオプションを実装するために呼び出す関数)は必要ないため削除し、4番目のパラメーター("menu slug")をに変更しましたthemes.php?goto=build-styleguide-page

themes.php一貫性を保つために、他の外観オプションと同じページ()にリダイレクトした場合、4番目のパラメーターにはほぼ文字通り何でも選択できますが、またgoto、WordPressはこの名前を使用せず、この意味があるように見えるため、私は勝手に名前を思いつきました。

add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
  add_theme_page(
    'Theme Styleguide',
    'Theme Styleguide',
    'administrator',
    'themes.php?goto=build-styleguide-page'
  );
}

ところで、build_styleguide_page()このソリューションでは必要ないので、関数を削除しました。

最も早いフックでのリダイレクトthemes.phpafter_setup_theme

最後のコードとして、関数にafter_setup_themeフックを実装しますredirect_from_admin_menu()。現在のページがであるかどうかthemes.phpを確認し、URLパラメータがURL gotoで渡されたことを確認するテストを行います。次にgotoswitch/ caseステートメントを使用して値がテストされ、値が'build-styleguide-page';であるかどうかが確認され ます。もしそうなら、それはあなたの述べられた架空の例にリダイレクトします例えばグーグル

add_action('after_setup_theme', 'redirect_from_admin_menu');
function redirect_from_admin_menu($value) {
  global $pagenow;
  if ($pagenow=='themes.php' && !empty($_GET['goto'])) {
    switch ($_GET['goto']) {
      case 'build-styleguide-page':
        wp_redirect("http://www.google.com");
        break;
      default:
        wp_safe_redirect('/wp-admin/');
        break;
    }
    exit;
  }
}

ノート:

  1. 必要に応じてリダイレクトを追加しやすくするために、フック/ 関数でswitch/ caseステートメントを使用することを選択しました。さらにcaseステートメントを追加するだけです。after_setup_themeredirect_from_admin_menu()goto

  2. 機能実際に終了しません。明示的にexitステートメントを発行して、WordPressを停止し、リダイレクトをオーバーライドしないようにする必要があります。wp_redirect()wp_safe_redirect()

お役に立てれば!


22

アイテムを$submenu配列に直接追加してメニューに追加すると、リダイレクトを行う必要がなくなり、完全なオフサイトURLをメニューリンクとして使用できるようになります(これは自分で行います)。

add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
    global $submenu;
    $submenu['index.php'][500] = array( 'Menu item name', 'manage_options' , 'http://example.com' ); 
}  

index.phpは親メニューのキー/リンクを表すため、この例では基本的にダッシュボードメニューに項目を追加しています。

もちろん、add_{type}_page関数を使用するほどきれいではありませんが、WordPressが管理メニューリンクのオフサイトURLを防止するという事実を回避します。

さまざまな仮想ホストをメニューに追加するのに似たものを使用するため、管理メニューから他のインストールに直接切り替えることができます(すべてスクリプトで行われますが、基本的に上記のコードの栄光バージョンを使用します)。

注:コードを使用する場合は、使用中のキー(サンプルコードの500配列キー)を割り当てないように注意してください。

ヒント:メニューキーで実際に負の値を使用して、ネイティブのWordPressアイテムの前にメニューアイテムを強制的に配置できます。


注:ただし、負のキーを文字列として設定する必要があると思います。そうでは'-5'ない-5場合、キーは無効と見なされます(i think)..(iが間違っていなければ、負の文字列は機能します)..
t31os

ありがたいことに、実際の関数では実行できないことは残念ですが、これは単にリンクを作成するためにフック/リダイレクトコンボを追加するよりもはるかに優れています。
エル・ヨボ

2
この特定の回答は、私のプラグインの投稿ステータスメニュー項目に役立ちました(おそらくそれが何をするか推測できます)。とにかく、他のプラグインがどのメニューに何かを追加するのかわからなかったので、他のプラグインとのarray_push()衝突を避けるためにメニュー項目を追加するために使用したものを追加したいと思いました。
mrwweb

チャームのように機能し、さらにそのような小さなスニペットを使用するためのボーナスポイント。
ジョアン

2
+1。キーを選択して希望するのではなく、最後のキーを取得してインクリメントします。たとえば、[ツール]メニューにサブメニュー項目を追加する場合:global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = その他
webaware

3

私はこれで同じことを達成しました:

function add_custom_menu_item(){
    add_menu_page( 'Menu Item Title', 'Page Title', 'manage_options', 'page_slug', 'function', 'dashicons-icon', 1 );
}
add_action( 'admin_menu', 'add_custom_menu_item' );

function custom_menu_item_redirect() {

    $menu_redirect = isset($_GET['page']) ? $_GET['page'] : false;

    if($menu_redirect == 'page_slug' ) {
        wp_safe_redirect( home_url('/my-page') );
        exit();
    }

}
add_action( 'admin_init', 'custom_menu_item_redirect', 1 );

ここでは、メニュー項目を追加してスラッグを定義し、「admin_init」でスラッグが存在するかどうかを確認し、目的の場所にリダイレクトします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.