問題描述

有沒有辦法添加一個任意的超鏈接到 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()進行重定向會發生錯誤 (無法修改標題信息) 。

最佳解決方案

你好湯姆,

如果我正確地理解你的問題,那麼你並不需要知道如何添加菜單鏈接 (似乎已經知道了),而是需要學習如何使鏈接重定向到正確的位置,對嗎?

從管理菜單項重定向到外部 URL

如果是這樣,您需要做的就是不要使用菜單項功能,而是使用”hook” WordPress,以便它不會輸出除 HTTP 頭之外的任何東西。調用/wp-admin/themes.php 時,最早的掛鈎似乎是 after_setup_theme,它似乎工作正常。

使用”Menu Slug” 所以你可以在鈎子測試它

但是要使其正常工作,我們首先需要在 admin_menu 鈎子/create_theme_style_page()函數中修改您對 add_theme_page 的調用。我們刪除了第五個參數 (調用實現 admin 選項的函數),因為我們不需要它,並將第四個參數 (“menu slug”) 更改為 themes.php?goto=build-styleguide-page

雖然我們可以選擇幾乎任何第四個參數的任何東西,給定我們將重定向到路由到同一頁 (themes.php) 作為其他外觀選項一致性。我也只是隨便想出了名稱 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'
  );
}

BTW,我們擺脱了您的 build_styleguide_page()功能,因為我們不需要這個解決方案。

themes.php 最早掛鈎重定向:after_setup_theme

作為我們最後一代的代碼,我們在 redirect_from_admin_menu()功能中實現了 after_setup_theme 鈎子。我們測試了當前頁面是否為 themes.php,並確保 URL 上傳遞了 goto 的 URL 參數。然後使用 switch /case 語句測試 goto 的值,看它是否具有值'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. 我選擇在 after_setup_theme 鈎子/redirect_from_admin_menu()函數中使用 switch /case 語句,以便如果需要,可以更容易地添加其他 goto 重定向; 只需添加更多的 case 語句。

  2. wp_redirect()wp_safe_redirect()功能實際上並不終止; 你需要明確的發出一個退出語句來讓 WordPress 停止,而不會重寫你的重定向。

希望這可以幫助!

次佳解決方案

如果您直接將它添加到 $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 功能那麼漂亮,但它確實是 work-around 事實上 WordPress 在管理菜單鏈接中阻止 off-site URL 。

我使用類似的東西將我的各種虛擬主機添加到菜單中,所以我可以直接從管理菜單切換到其他安裝 (全部使用腳本,但基本上使用上述代碼的榮耀版本) 。

注意:如果您決定使用代碼,請小心不要分配正在使用的密鑰 (示例代碼中的 500 數組鍵) 。

提示:您可以在菜單鍵中實際使用負值,因此您可以強制菜單項位於任何本地 WordPress 項目之前。

參考文獻

注:本文內容整合自 google/baidu/bing 翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:gxnotes#qq.com(#替換為 @) 。