Додати довільне посилання до меню адміністратора?


20

Чи є спосіб додати довільне гіперпосилання до адміністраторського меню WordPress (я маю на увазі меню зліва, коли ви входите на інформаційну панель адміністратора)? Наприклад, чи можна додати посилання на Google?

У моєму конкретному випадку я хотів би додати сторінку керівництва стилем для теми Wordpress, над якою я працюю, щоб я міг показати користувачеві, як різні елементи HTML стилізовані до теми, і продемонструвати, як красиво стилювати різні речі.

Це код, який я мав досі ( зауважте: він є неповним ): У function.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()помилкою ( Неможливо змінити інформацію заголовка ).

Відповіді:


13

Привіт @Tom ,

Якщо я правильно розумію ваше запитання, вам не так багато потрібно знати, як додати посилання в меню (здається, ви це вже знаєте), а натомість потрібно навчитися отримувати ваше посилання для переадресації правильно, правда?

Перенаправлення на зовнішню URL-адресу з пункту меню адміністратора

Якщо так, то вам потрібно не використовувати функцію пункту меню, а замість того, щоб «зачепити» WordPress досить рано, щоб він не виводив нічого, крім можливих заголовків HTTP. Найдавніший гак під час дзвінка /wp-admin/themes.phpздається, after_setup_themeі він, здається, працює добре.

Використовуйте "Меню слизька", щоб ви могли його перевірити на гачку

Але для того, щоб він працював, спершу нам потрібно змінити ваш дзвінок add_theme_pageу admin_menuгачку / вашій create_theme_style_page()функції. Ми скинули п’ятий параметр (функція викликати для реалізації параметра адміністрування), оскільки він нам не потрібен, і змінили четвертий параметр ( "меню слугу" ) на 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'
  );
}

До речі, ми позбулися вашої build_styleguide_page()функції, оскільки нам це не потрібно для цього рішення.

Перенаправлення на найдавніший гачок на themes.php:after_setup_theme

Як наш останній біт коду, ми реалізуємо наш after_setup_themeгак у своїй redirect_from_admin_menu()функції. У нас є тест, щоб перевірити, чи є поточна сторінка, themes.phpі переконатися, що URL-адресу gotoбуло передано параметр URL-адреси. Потім він перевіряє значення gotoвикористання switch/ caseоператора, щоб перевірити, чи має він значення 'build-styleguide-page'; якщо так, то він переспрямовує на вашу заявлену гіпотетичну форму, наприклад, Google, інакше ми просто перенаправляємося назад на панель адміністратора:

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. Я вирішив використовувати switch/ caseоператор у after_setup_themeгачку / redirect_from_admin_menu()функції, щоб було легше додати додаткові gotoпереадресації, якщо вам потрібно; просто додайте більше тверджень справи.

  2. wp_redirect()і wp_safe_redirect()функції фактично не припиняється; вам потрібно явно видати заяву про вихід, щоб змусити WordPress зупинятись і не змінювати переадресацію.

Сподіваюся, це допомагає!


22

Якщо ви додасте свій елемент у меню, додавши його $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функцій, але це обходиться з тим фактом, що WordPress запобігає виїзним URL-адресам у посиланнях адміністратора.

Я використовую щось подібне, щоб додати в меню свої різні віртуальні хости, тому я можу перейти на інші установки безпосередньо з меню адміністратора (все зроблено зі сценарієм, але в основному використовує прославлену версію вищевказаного коду).

ПРИМІТКА. Якщо ви вирішили використовувати код, будьте обережні, щоб не призначити використовуваний ключ (ключ масиву 500 у прикладі коду).

Порада: Ви можете використовувати негативні значення в клавішах меню для, щоб ви могли змусити елементи меню сидіти перед будь-яким з рідних пунктів WordPress.


ПРИМІТКА. Я думаю, вам буде потрібно встановити цей негативний ключ як рядок, тобто. '-5'і ні -5, інакше ключ вважається недійсним (я думаю) .. (негативні рядки працюють, хоча, якщо я не помиляюся) ..
t31os

Дякую, гадає, що ти не можеш це зробити з реальними функціями, але це набагато краще, ніж додавати комбо / гачок / переадресацію, щоб мати посилання.
El Yobo

2
Ця конкретна відповідь допомогла мені в моєму плагіні Пункти меню "Стан повідомлення" (ви, мабуть, можете здогадатися, що це робить). У всякому разі, оскільки я не знав, які ще додатки додаватимуть речі до меню, я подумав, що просто додам, що я додав array_push()пункти меню, щоб уникнути зіткнення з будь-якими іншими плагінами.
mrwweb

Працює як шарм, плюс бонусний бал за використання такого маленького фрагмента.
Жоао

2
+1. Замість того, щоб вибирати ключ і сподіватися, просто захопіть останній ключ і приріст. Наприклад, додаючи елемент підменю до меню «Інструменти»: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = etc.
webaware

3

Я домігся цього і з цим:

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

Що ви тут робите, це ви додаєте пункт меню та визначаєте слизьку, після чого на "admin_init" ви перевіряєте, чи існує слиз і перенаправляєте на потрібне місце.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.