it-swarm-id.com

Menambahkan Tautan Sewenang-wenang ke Menu Admin?

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 bagaimana gaya berbagai hal dengan baik.

Ini adalah kode yang saya miliki sejauh ini ( note: 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 ).

20
Tom

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 "hook" WordPress cukup awal sehingga tidak menghasilkan apa-apa kecuali kemungkinan header HTTP. Hook paling awal ketika memanggil /wp-admin/themes.php tampaknya after_setup_theme dan tampaknya berfungsi dengan baik.

Gunakan "Menu Slug" Jadi Anda Dapat Mengujinya di Hook

Tetapi untuk membuatnya berfungsi, pertama-tama kita perlu memodifikasi panggilan Anda ke add_theme_page dalam fungsi admin_menu hook/create_theme_style_page() 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 sembarangan muncul dengan nama 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 fungsi build_styleguide_page() Anda karena kami tidak memerlukannya untuk solusi ini.

Redirect di Hook Terlama untuk themes.php: after_setup_theme

Sebagai bit kode terakhir kami, kami menerapkan kait after_setup_theme kami di fungsi redirect_from_admin_menu() kami. Kami mengujinya untuk melihat apakah halaman saat ini adalah themes.php dan untuk memastikan parameter URL gotodisahkan pada URL. Kemudian ia menguji nilai gotomenggunakan switchname __/casepernyataan untuk melihat apakah ia memiliki nilai 'build-styleguide-page'; jika demikian itu akan diarahkan ke hipotesis yang Anda nyatakan mis. 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 switchname __/casedalam fungsi after_setup_theme hook/redirect_from_admin_menu() sehingga akan lebih mudah untuk menambahkan pengalihan gototambahan jika Anda perlu; cukup tambahkan lebih banyak pernyataan kasus.

  2. fungsi wp_redirect() dan wp_safe_redirect() tidak benar-benar berakhir; Anda perlu mengeluarkan pernyataan keluar secara eksplisit agar WordPress berhenti dan tidak mengganti arahan ulang Anda.

Semoga ini membantu!

13
MikeSchinkel

Jika Anda menambahkan item Anda ke dalam menu dengan menambahkannya ke array $submenu secara langsung, Anda akan menghindari keharusan untuk melakukan pengalihan dan dapat menggunakan URL offsite lengkap sebagai tautan menu (saya melakukan ini 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.php mewakili kunci/tautan dari menu induk, jadi pada contoh ini saya pada dasarnya menambahkan item ke Dashboard menu ..

Tentu, itu tidak secantik menggunakan fungsi add_{type}_page, tapi itu bekerja-sekitar fakta 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 sedang digunakan (kunci array 500 dalam kode contoh).

TIP: Anda benar-benar dapat menggunakan nilai negatif pada tombol menu, sehingga Anda dapat memaksa Anda item menu untuk duduk sebelum salah satu item WordPress asli.

21
t31os

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 ke lokasi yang Anda inginkan.

3
Bobz