web-dev-qa-db-ja.com

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

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

私の特定のケースでは、私が取り組んでいるWordpressテーマのスタイルガイドページを追加して、さまざまなHTML要素がテーマでどのようにスタイル設定されているかをユーザーに示すことができます。

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

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()を使ってリダイレクトしようとするとエラーになります( ヘッダー情報を変更できません )。

20
Tom

こんにちは@Tom

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

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

もしそうなら、あなたがする必要があるのはメニュー項目関数を使用するのではなく、代わりに "hook" WordPressを使用することで、それはおそらくHTTPヘッダを除いて何も出力しません。 /wp-admin/themes.phpを呼び出すときの最も早いフックはafter_setup_themeであるように見え、それはうまくいくように見えます。

"Menu Slug" を使うとフックでテストできます

しかしそれを機能させるには、まずadd_theme_pageフック/あなたのcreate_theme_style_page()関数でadmin_menuへの呼び出しを変更する必要があります。 5番目のパラメータ(adminオプションを実装するために呼び出す関数)は必要ないので削除し、4番目のパラメータ( "menu slug" )をthemes.php?goto=build-styleguide-pageに変更しました。

4番目のパラメータにはほぼ文字通り何でも選択することができましたが、一貫性を保つための他の外観オプションとして、同じページ(themes.php)にルーティングしたときにリダイレクトします。 WordPressでは使われていないのでgotoという名前を思いついたのですが、これは意味があります。

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.phpのリダイレクト:after_setup_theme

最後のコードとして、redirect_from_admin_menu()関数にafter_setup_themeフックを実装します。現在のページがthemes.phpであるかどうか、およびURLにgotoというURLパラメータが渡されていることを確認するためのテストを行います。それからgoto/switchステートメントを使用してcaseの値をテストし、'build-styleguide-page'の値があるかどうかを確認します。もしそうなら、それはあなたの述べた仮説にリダイレクトします。それ以外の場合、Googleは管理者ダッシュボードにリダイレクトします。

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. after_setup_themeフック/ redirect_from_admin_menu()関数でswitch/caseステートメントを使用することにしたので、必要に応じてgotoリダイレクトを追加しやすくなります。 case文を追加するだけです。

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

お役に立てれば!

13
MikeSchinkel

あなたがそれを$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は親メニューのキー/リンクを表すので、この例では基本的に Dashboard menuに項目を追加します。

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

私はいろいろな仮想ホストをメニューに追加するのに似たようなものを使っているので、管理者メニューから直接他のインストールに切り替えることができます(すべてスクリプトで行われますが、基本的に上のコードの賛成バージョンを使います)。

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

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

21
t31os

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

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

ここですることは、メニュー項目を追加してslugを定義してから、 'admin_init'でslugが存在するかどうかを確認して希望の場所にリダイレクトすることです。

3
Bobz