Dodanie arbitralnego linku do menu administratora?

20

Czy istnieje sposób, aby dodać dowolne hiperłącze do menu administratora WordPress (mam na myśli menu po lewej stronie, gdy logujesz się do pulpitu administratora)? Czy na przykład można dodać link do Google?

W moim szczególnym przypadku chciałbym dodać stronę przewodnika po stylach dla motywu Wordpress, nad którym pracuję, aby pokazać użytkownikowi, w jaki sposób różne elementy HTML są stylizowane za pomocą tego motywu, i pokazać, jak ładnie stylizować różne rzeczy.

Oto kod, który mam do tej pory ( uwaga: jest niekompletny ): W functions.php dodałem nowy element menu w sekcji Wygląd :

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

W build_styleguide_page()próbie przekierowania za pomocą header()pojawia się błąd ( nie można zmodyfikować informacji w nagłówku ).

Tomek
źródło

Odpowiedzi:

13

Cześć @ Tom ,

Jeśli dobrze rozumiem twoje pytanie, nie musisz tak bardzo wiedzieć, jak dodać link do menu (wydaje się, że już to wiesz), ale zamiast tego musisz nauczyć się, jak poprawnie przekierować link, prawda?

Przekierowanie na zewnętrzny adres URL z pozycji menu administratora

Jeśli tak, to nie należy używać funkcji pozycji menu, ale zamiast tego „zaczepić” WordPressa wystarczająco wcześnie, aby nie wyprowadzał niczego poza możliwymi nagłówkami HTTP. Najwcześniejszy haczyk podczas połączenia /wp-admin/themes.phpwydaje się być after_setup_themei wydaje się działać dobrze.

Użyj „Menu Slug”, aby przetestować go w haku

Ale żeby zmusić go do pracy musimy najpierw zmodyfikować swoje wywołanie add_theme_pagew admin_menuhak / swojej create_theme_style_page()funkcji. Porzuciliśmy piąty parametr (funkcję do wywołania w celu zaimplementowania opcji administratora), ponieważ go nie potrzebujemy, i zmieniliśmy czwarty parametr ( „ślimak menu” ) na themes.php?goto=build-styleguide-page.

Chociaż moglibyśmy wybrać prawie dosłownie wszystko dla czwartego parametru, biorąc pod uwagę, że przekierujemy I skierowany do tej samej strony ( themes.php), co inne opcje wyglądu dla spójności. Po prostu arbitralnie wymyśliłem nazwę, gotoponieważ WordPress jej nie używa i wydaje się to mieć sens.

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, pozbyliśmy się twojej build_styleguide_page()funkcji, ponieważ nie potrzebujemy jej do tego rozwiązania.

Przekieruj w najwcześniejszym haku dla themes.php:after_setup_theme

Jako nasz ostatni fragment kodu implementujemy nasz after_setup_themehook w naszej redirect_from_admin_menu()funkcji. Mamy test, aby sprawdzić, czy bieżąca strona jest themes.phpi upewnić się, że parametr adresu URL gotozostał przekazany na adres URL. Następnie sprawdza wartość gotoza pomocą instrukcji switch/ case, aby sprawdzić, czy ma wartość 'build-styleguide-page'; jeśli tak, przekierowuje do Twojej hipotetycznej strony, np. Google, w przeciwnym razie po prostu przekierowujemy z powrotem do pulpitu administratora:

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

Uwagi:

  1. Zdecydowałem się użyć instrukcji switch/ casew funkcji after_setup_themehook /, redirect_from_admin_menu()aby łatwiej było dodawać dodatkowe gotoprzekierowania, jeśli zajdzie taka potrzeba; po prostu dodaj więcej instrukcji case.

  2. wp_redirect()i wp_safe_redirect()funkcje nie faktycznie rozwiązać; musisz jawnie wydać instrukcję wyjścia, aby WordPress się zatrzymał i nie zastąpił przekierowania.

Mam nadzieję że to pomoże!

MikeSchinkel
źródło
22

Jeśli dodasz swój przedmiot do menu, dodając go $submenubezpośrednio do tablicy, unikniesz konieczności przekierowania i będziesz mógł użyć pełnego adresu URL poza witryną jako linku do menu (robię to sam).

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.phpreprezentuje klucz / link menu nadrzędnego, więc w tym przykładzie w zasadzie dodaję element do menu Pulpitu nawigacyjnego .

Jasne, nie jest tak ładna jak korzystanie z add_{type}_pagefunkcji, ale działa w ten sposób, że WordPress zapobiega adresom URL poza witryną w linkach menu administratora.

Używam czegoś podobnego do dodawania różnych wirtualnych hostów do menu, więc mogę przełączać się do innych instalacji bezpośrednio z menu administratora (wszystko to odbywa się za pomocą skryptu, ale w zasadzie używa gloryfikowanej wersji powyższego kodu).

UWAGA: Jeśli zdecydujesz się użyć kodu, uważaj, aby nie przypisać używanego klucza (klucz tablicy 500 w przykładowym kodzie).

WSKAZÓWKA: Możesz użyć ujemnych wartości w klawiszach menu, aby zmusić elementy menu do siedzenia przed dowolnym rodzimym elementem WordPress.

t31os
źródło
UWAGA: Myślę, że będziesz musiał ustawić ten klucz ujemny jako ciąg znaków, tj. '-5'i nie -5, w przeciwnym razie klucz zostanie uznany za nieważny (tak mi się wydaje) .. (choć ciągi ujemne działają, jeśli się nie mylę) ..
t31os
Dzięki, szkoda, że ​​nie da się tego zrobić za pomocą prawdziwych funkcji, ale jest to o wiele lepsze niż dodawanie kombinacji hook / redirect tylko po to, by mieć link.
El Yobo,
2
Ta konkretna odpowiedź pomogła mi z moją wtyczką Pozycje menu Stan postu (prawdopodobnie możesz zgadnąć, co to robi). W każdym razie, ponieważ nie wiedziałem, jakie inne wtyczki będą dodawać rzeczy do jakich menu, pomyślałem, że dodam tylko, że array_push()dodawałem elementy menu, aby uniknąć kolizji z innymi wtyczkami.
mrwweb
Działa jak urok, plus punkt bonusowy za użycie tak małego fragmentu.
João
2
+1. Zamiast wybierać klucz i mieć nadzieję, po prostu weź ostatni klucz i przyrost. Na przykład przy dodawaniu podmenu do menu Narzędzia: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = itp.
internetowa
3

Osiągnąłem to samo z tym:

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

Tutaj dodajesz pozycję menu i definiujesz ślimak, a następnie w „admin_init” sprawdzasz, czy ślimak istnieje i przekierowujesz do pożądanej lokalizacji.

Bobz
źródło