Menambahkan Tautan Sewenang-wenang ke Menu Admin?

20

Apakah ada cara untuk menambahkan hyperlink sewenang-wenang ke menu admin WordPress (maksud saya menu di sebelah kiri ketika Anda masuk ke dashboard admin)? Misalnya, dapatkah seseorang menambahkan tautan ke Google?

Dalam kasus khusus saya, saya ingin menambahkan halaman styleguide untuk tema Wordpress yang sedang saya kerjakan sehingga saya dapat menunjukkan kepada pengguna bagaimana elemen HTML yang berbeda ditata dengan tema dan untuk mendemonstrasikan cara mendesain berbagai hal dengan baik.

Ini adalah kode yang saya miliki sejauh ini ( catatan: tidak lengkap ): Di functions.php saya telah menambahkan item menu baru di bagian Penampilan :

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

Dalam build_styleguide_page(), mencoba mengalihkan dengan header()memberikan kesalahan ( Tidak dapat mengubah informasi header ).

Tom
sumber

Jawaban:

13

Hai @ Tom ,

Jika saya memahami pertanyaan Anda dengan benar, Anda tidak perlu terlalu banyak tahu cara menambahkan tautan ke menu (sepertinya Anda sudah tahu itu) tetapi sebaliknya perlu belajar cara membuat tautan Anda untuk mengarahkan ulang dengan benar, bukan?

Mengarahkan kembali ke URL Eksternal dari Item Menu Admin

Jika demikian yang perlu Anda lakukan adalah tidak menggunakan fungsi item menu melainkan "mengait" WordPress cukup awal sehingga tidak menghasilkan apa-apa kecuali kemungkinan header HTTP. Kait paling awal saat menelepon /wp-admin/themes.phptampaknya after_setup_themedan berfungsi dengan baik.

Gunakan "Menu Slug" Jadi Anda Bisa Mengujinya di Hook

Tetapi untuk membuatnya berfungsi, pertama-tama kita perlu memodifikasi panggilan Anda add_theme_pagedi admin_menuhook / create_theme_style_page()fungsi Anda . Kami menjatuhkan parameter kelima (fungsi untuk memanggil untuk mengimplementasikan opsi admin) karena kami tidak membutuhkannya, dan mengubah parameter keempat ( "menu slug" ) menjadi themes.php?goto=build-styleguide-page.

Meskipun kami dapat memilih hampir apa saja untuk parameter keempat, mengingat kami akan mengarahkan saya dialihkan ke halaman yang sama ( themes.php) sebagai opsi tampilan lain untuk konsistensi. Saya juga secara sewenang-wenang membuat nama itu gotokarena WordPress tidak menggunakannya dan sepertinya masuk akal untuk ini.

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, kami menyingkirkan build_styleguide_page()fungsi Anda karena kami tidak membutuhkannya untuk solusi ini.

Redirect di Hook Terlama untuk themes.php:after_setup_theme

Sebagai bit kode terakhir kami, kami menerapkan after_setup_themehook kami di redirect_from_admin_menu()fungsi kami . Kami mengujinya untuk melihat apakah halaman saat ini themes.phpdan untuk memastikan parameter URL gototelah diteruskan pada URL. Kemudian ia menguji nilai gotomenggunakan pernyataan switch/ caseuntuk melihat apakah memiliki nilai 'build-styleguide-page'; jika demikian itu akan diarahkan ke hipotesis Anda yang dinyatakan misalnya Google kalau tidak, kami hanya mengarahkan kembali ke dasbor admin:

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

Catatan:

  1. Saya memilih untuk menggunakan pernyataan switch/ casedi after_setup_themehook / redirect_from_admin_menu()fungsi sehingga akan lebih mudah untuk menambahkan arahan gotoulang jika Anda perlu; cukup tambahkan lebih banyak pernyataan kasus.

  2. yang wp_redirect()dan wp_safe_redirect()fungsi tidak benar-benar mengakhiri; Anda perlu mengeluarkan pernyataan keluar secara eksplisit untuk menghentikan WordPress dan tidak mengganti arahan ulang Anda.

Semoga ini membantu!

MikeSchinkel
sumber
22

Jika Anda menambahkan item Anda ke menu dengan menambahkannya ke menu $submenu array secara langsung, Anda akan menghindari keharusan untuk melakukan pengalihan dan dapat menggunakan URL offsite lengkap sebagai tautan menu (saya melakukannya sendiri).

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.phpmewakili kunci / tautan dari menu induk, jadi pada contoh ini saya pada dasarnya menambahkan item ke menu Dashboard ..

Tentu, itu tidak secantik menggunakan add_{type}_page fungsi fungsi, tetapi ia bekerja dengan fakta bahwa WordPress mencegah URL di luar situs di tautan menu admin ..

Saya menggunakan sesuatu yang mirip dengan menambahkan berbagai host virtual saya ke dalam menu, sehingga saya dapat beralih ke instalasi lain langsung dari menu admin (semua dilakukan dengan skrip, tetapi pada dasarnya menggunakan versi yang dimuliakan dari kode di atas).

CATATAN: Jika Anda memutuskan untuk menggunakan kode, berhati-hatilah untuk tidak menetapkan kunci yang digunakan (kunci array 500 dalam kode contoh).

TIP: Anda sebenarnya dapat menggunakan nilai negatif pada tombol menu, sehingga Anda dapat memaksa item menu Anda untuk duduk di depan item WordPress asli mana pun.

t31os
sumber
CATATAN: Saya pikir Anda perlu mengatur kunci negatif itu sebagai string, yaitu. '-5'dan tidak -5, kalau kuncinya dianggap tidak valid (saya pikir) .. (string negatif berfungsi, jika saya tidak salah) ..
t31os
Terima kasih, menyebalkan bahwa Anda tidak dapat melakukannya dengan fungsi yang sebenarnya, tetapi ini jauh lebih baik daripada harus menambahkan hook / redirect combo hanya untuk memiliki tautan.
El Yobo
2
Jawaban khusus ini membantu saya dengan plugin saya Item Menu Status Posting (Anda mungkin bisa menebak apa fungsinya). Lagi pula, karena saya tidak tahu plugin apa yang akan menambahkan barang ke menu apa, saya pikir saya hanya akan menambahkan bahwa saya dulu array_push()menambahkan item menu untuk menghindari bertabrakan dengan plugin lain.
mrwweb
Bekerja seperti pesona, plus poin bonus untuk menggunakan cuplikan sekecil itu.
João
2
+1. Daripada mengambil kunci dan berharap, ambil saja kunci terakhir dan kenaikan. Misalnya, saat menambahkan item submenu ke menu Alat: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = dll.
webaware
3

Saya telah mencapai hal yang sama dengan ini:

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

Apa yang Anda lakukan di sini adalah Anda menambahkan item menu dan mendefinisikan siput, lalu pada 'admin_init' Anda memeriksa apakah siput ada dan mengarahkan ulang ke lokasi yang Anda inginkan.

Bobz
sumber