Hinzufügen eines beliebigen Links zum Admin-Menü?

20

Gibt es eine Möglichkeit, dem WordPress-Admin-Menü einen beliebigen Hyperlink hinzuzufügen (ich meine das Menü auf der linken Seite, wenn Sie sich im Admin-Dashboard anmelden)? Kann man zum Beispiel einen Link zu Google hinzufügen?

In meinem speziellen Fall möchte ich eine Styleguide-Seite für ein Wordpress-Thema hinzufügen, an dem ich arbeite, damit ich dem Benutzer zeigen kann, wie verschiedene HTML-Elemente mit dem Thema gestaltet sind, und um zu demonstrieren, wie verschiedene Dinge schön gestaltet werden.

Dies ist der Code, den ich bisher habe ( Anmerkung: er ist unvollständig ): In functions.php habe ich einen neuen Menüpunkt im Bereich Aussehen hinzugefügt :

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?";
}

Beim build_styleguide_page()Versuch, mit umzuleiten, tritt header()ein Fehler auf ( Header-Informationen können nicht geändert werden ).

Tom
quelle

Antworten:

13

Hallo @Tom ,

Wenn ich Ihre Frage richtig verstehe, müssen Sie nicht so sehr wissen, wie Sie einen Link zum Menü hinzufügen (anscheinend wissen Sie das bereits), sondern müssen lernen, wie Sie Ihren Link dazu bringen, richtig umzuleiten, oder?

Umleiten zu einer externen URL von einem Admin-Menüelement

Wenn ja, müssen Sie nicht den Menüpunkt function verwenden, sondern WordPress so früh "einbinden" , dass es nichts außer möglicherweise HTTP-Headern ausgibt. Der früheste Haken beim Anrufen /wp-admin/themes.phpscheint zu sein after_setup_themeund es scheint gut zu funktionieren.

Verwenden Sie einen "Menu Slug", damit Sie ihn in einem Hook testen können

Aber um es zum Laufen zu bringen, müssen wir zuerst Ihren Anruf add_theme_pagein den admin_menuHook / Ihre create_theme_style_page()Funktion ändern . Wir haben den fünften Parameter (die Funktion, die aufgerufen werden muss, um die Admin-Option zu implementieren) gelöscht, weil wir ihn nicht benötigen, und den vierten Parameter (den "Menü-Slug" ) geändert themes.php?goto=build-styleguide-page.

Obwohl wir für den vierten Parameter buchstäblich alles hätten wählen können, habe ich, da wir umleiten werden, aus Gründen der themes.phpKonsistenz auf dieselbe Seite ( ) weitergeleitet wie andere Darstellungsoptionen. Ich habe mir den Namen auch nur willkürlich gotoausgedacht, weil WordPress ihn nicht verwendet und es dafür Sinn zu machen scheint.

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

Übrigens, wir haben Ihre build_styleguide_page()Funktion aufgegeben, weil wir sie für diese Lösung nicht benötigen.

Weiterleiten im frühesten Hook für themes.php:after_setup_theme

Als letzten Code implementieren wir unseren after_setup_themeHook in unsere redirect_from_admin_menu()Funktion. Wir haben es getestet, um festzustellen, ob die aktuelle Seite ist themes.phpund um sicherzustellen, dass ein URL-Parameter von gotoan die URL übergeben wurde. Dann testet es den Wert der gotoVerwendung einer switch/ case-Anweisung, um festzustellen, ob sie den Wert hat 'build-styleguide-page'; Wenn dies der Fall ist, werden Sie zu Ihrer angegebenen Hypothese weitergeleitet, z. B. zu Google. Andernfalls werden Sie einfach zum Admin-Dashboard zurückgeleitet:

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

Anmerkungen:

  1. Ich habe die Anweisung switch/ casein der Funktion after_setup_themehook / redirect_from_admin_menu()verwendet, damit Sie bei Bedarf einfacher zusätzliche gotoWeiterleitungen hinzufügen können . Fügen Sie einfach weitere case-Anweisungen hinzu.

  2. Die Funktionen wp_redirect()und wp_safe_redirect()werden nicht beendet. Sie müssen explizit eine exit-Anweisung ausgeben, damit WordPress die Weiterleitung stoppt und nicht überschreibt.

Hoffe das hilft!

MikeSchinkel
quelle
22

Wenn Sie Ihr Element zum Menü hinzufügen, indem Sie es $submenudirekt zum Array hinzufügen, müssen Sie die Umleitung nicht ausführen und können eine vollständige URL außerhalb des Standorts als Menülink verwenden (ich mache das selbst).

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.phpStellt die Taste / den Link des übergeordneten Menüs dar. In diesem Beispiel füge ich dem Dashboard- Menü also im Grunde ein Element hinzu .

Sicher, es ist nicht ganz so schön wie die Verwendung der add_{type}_pageFunktionen, aber es umgeht die Tatsache, dass WordPress Off-Site-URLs in Admin-Menü-Links verhindert.

Ich benutze etwas Ähnliches, um meine verschiedenen virtuellen Hosts in das Menü einzufügen, damit ich direkt aus dem Admin-Menü zu anderen Installationen wechseln kann (alles mit einem Skript, aber im Grunde genommen mit einer verherrlichten Version des obigen Codes).

HINWEIS: Wenn Sie sich für die Verwendung des Codes entscheiden, achten Sie darauf, keinen verwendeten Schlüssel zuzuweisen (den 500-Array-Schlüssel im Beispielcode).

TIPP: Sie können tatsächlich negative Werte in den Menütasten verwenden, um zu erzwingen, dass sich die Menüelemente vor den nativen WordPress-Elementen befinden.

t31os
quelle
HINWEIS: Ich denke, Sie müssen diesen negativen Schlüssel jedoch als Zeichenfolge festlegen, d. H. '-5'und nicht -5, sonst gilt der Schlüssel als ungültig (glaube ich) .. (negative Zeichenfolgen funktionieren jedoch, wenn ich mich nicht irre) ..
t31os
Danke, zum Kotzen, dass Sie das mit den echten Funktionen nicht machen können, aber das ist viel besser, als eine Hook / Redirect-Kombination hinzuzufügen, nur um einen Link zu haben.
El Yobo,
2
Diese spezielle Antwort hat mir bei den Post Status Menu Items meines Plugins geholfen (Sie können wahrscheinlich erraten, was es tut). Wie auch immer, da ich nicht wusste, welche anderen Plugins welche Menüs ergänzen würden, dachte ich mir, ich würde nur hinzufügen, dass ich die array_push()Menüelemente angehängt habe, um zu vermeiden, dass sie mit anderen Plugins kollidieren.
Mrwweb
Funktioniert wie ein Zauber, plus Bonuspunkt für die Verwendung eines so kleinen Snippets.
João
2
+1. Anstatt einen Schlüssel auszuwählen und zu hoffen, greifen Sie einfach zum letzten Schlüssel und erhöhen Sie ihn. Zum Beispiel, wenn Sie ein Untermenüelement zum Menü global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] =
Extras
3

Ich habe dasselbe damit erreicht:

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

Sie fügen hier einen Menüeintrag hinzu und definieren slug. Dann überprüfen Sie auf 'admin_init', ob slug vorhanden ist, und leiten Sie an den gewünschten Ort weiter.

Bobz
quelle